1. 程式人生 > >linux下的C語言程序設計

linux下的C語言程序設計

情況下 make -c pro 編譯鏈接 二進制 概述 理解 條件

Linux程序設計基礎知識

Linux下C語言編程環境概述 Linux下C語言編程常用的編輯器是vim或emacs,編譯器一般用gcc,編譯鏈接程序用make,跟蹤調試一般使用gdb,項目管理用makefile。

程序安裝目錄

對一個Linux開發人員來說,在使用一種編程語言編寫程序以前,對操作系統中程序的保存位置有一個透徹的了解是很重要的。

Linux下的程序通常都保存在專門的目錄裏。系統軟件可以在/usr/bin子目錄裏找到。系統管理員為某個特定的主機系統或本地網絡添加的程序可以在/usr/local/bin子目錄裏找到。

頭文件

對C語言來說,這些頭文件幾乎永遠保存在/usr/include及其下級子目錄裏。那些賴於所運行的 UNIX或Linux操作系統特定版本的頭文件一般可以在/usr/include/sys或/usr/include/linux子目錄裏找到。

在調用C語言編譯器的時候,可以通過給出“ -I”編譯命令標誌來引用保存在下級子目錄或者非標準位置的頭文件,類似命令如下:

[[email protected] linux]$ gcc -I /usr/openwin/include hello.c

庫文件

庫文件是一些預先編譯好的函數的集合,那些函數都是按照可再使用的原則編寫的。

標準的系統庫文件一般保存在/lib或者/usr/lib子目錄裏。編譯時要告訴 C語言編譯器(更確切地說是鏈接程序)應去查找哪些庫文件。默認情況下,它只會查找 C語言的標準庫文件。

gcc編譯器

安裝編譯器:yum -y install gcc

開放、自由和靈活是Linux的魅力所在,而這一點在gcc上的體現就是程序員通過它能夠更好地控制整個編譯過程。 在使用gcc編譯程序時,編譯過程可以細分為4個階段:

● 預處理(Pre-Processing)

● 編譯(Compiling)

● 匯編(Assembling)

● 鏈接(Linking)

Linux程序員可以根據自己的需要讓gcc在編譯的任何階段結束,檢查或使用編譯器在該階段的輸出信息,或者對最後生成的二進制文件進行控制,以便通過加入不同數量和種類的調試代碼來為今後的調試做好準備。

預處理

處理程序中所有帶‘’#‘’的語句,主要的工作:頭文件的包含和宏的定義。把#include包含進來的頭文件插入到#include所在的位置,將#define定義的宏用對應的字符串替換。

編譯

檢查代碼是否有語法錯誤。如果有錯,則會報錯,若沒有錯,則會把 .C 文件編譯成 .S 文件。

匯編

將所有的 .S 文件轉化為機器能識別的 .o二進制文 件。

鏈接

將所有的 .o 文件和需要的庫文件鏈接成一個可執行文件。

實例

創建一個名為3.c的文件:

技術分享圖片

要編譯這個程序,只要在命令行下執行如下命令:

技術分享圖片

這樣,gcc 編譯器會生成一個名為hello的可執行文件,然後執行./hello就可以看到程序的輸出結果了。

技術分享圖片

命令行中 gcc表示用gcc來編譯源程序,-o 選項表示要求編譯器輸出的可執行文件名為hello ,而hello.c是源程序文件。從程序員的角度看,只需簡單地執行一條gcc命令就可以了;

但從編譯器的角度來看,卻需要完成一系列非常繁雜的工作。首先,gcc需要調用預處理程序cpp,由它負責展開在源文件中定義的宏,並向其中插入#include語句所包含的內容;

接著,gcc會調用ccl和as將處理後的源代碼編譯成目標代碼;最後,gcc會調用鏈接程序ld,把生成的目標代碼鏈接成一個可執行程序。

為了更好地理解gcc的工作過程,可以把上述編譯過程分成幾個步驟單獨進行,並觀察每步的運行結果。

第一步要進行預編譯,使用-E參數可以讓gcc在預處理結束後停止編譯過程:

技術分享圖片

此時若查看hello.i文件中的內容,會發現stdio.h的內容確實都插到文件裏去了,而且被預處理的宏定義也都作了相應的處理。

技術分享圖片

怎麽來寫Makefile

Makefile的核心是:規則。當執行make命令時,編譯器會讀取當前目錄下的Makefile,然後根據Makefile的規則編譯。規則:

-------------------------------------------------------------

目標:依賴1 依賴2 … 依賴n

  命令

--------------------------------------------------------------

說明:使用命令,依賴將生成目標 註意:目標在首行頂格寫,而命令前有一個TAB鍵(制表符鍵),不能使用空格代替。

命令執行條件:

1. “依賴”文件 比 “目標”文件新(指文件日期更新)

2. 沒有“目標”這個文件 滿足上述條件之一,命令就會執行。

根據命令執行條件讓命令再次執行的方法

方法1:用rm命令刪除目標文件test

方法2:用touch命令修改(即更新)a.c b.c a.h,從而使依賴文件比目標文件新(指文件日期更新)。

Linux下C語言的makefile編寫

先來編寫一個最簡單的makefile(其為文件名)。

首先編寫add.c文件

技術分享圖片

再編寫sub.c文件

技術分享圖片

最後編寫test.h文件,

技術分享圖片

用這三個簡單的文件,我們就可以編寫文件makefile的代碼內容了。

test: add.o sub.o

  gcc -o test add.o sub.o

add.o: add.c test.h

  gcc -c add.c //選項 –c 表示只是編譯(compile)源程序,但並沒有連接(link)編譯好的中間目標文件。

sub.o: sub.c test.h

  gcc -c sub.c

clean: rm -f test *.o //編譯完後,鍵入make clean就會執行這一行語句,即把生成程序test和所有擴展名為.o的目標文件刪掉。

技術分享圖片

運行make編譯鏈接程序

技術分享圖片

查看輸出結果

技術分享圖片

linux下的C語言程序設計