拿到乙個源程式首先需要進行預處理,預處理的結果便是將標頭檔案的內容放入這個檔案中,比如乙個c語言程式通常需要包含stdio.h標頭檔案,這個標頭檔案裡包含一些函式和變數的宣告,預處理便會將這個檔案裡的內容放入。
編譯階段,這個階段是將我們的c語言**翻譯成彙編**。
彙編階段,彙編階段表示將彙編的**翻譯成機器**,現在已經是乙個二進位制檔案。
鏈結階段,鏈結表示將一些函式的實現和目標**鏈結在一起,預處理階段只是將函式的宣告放入檔案中,並沒有將函式的實現放入其中因此需要進行鏈結才能執行。
經過鏈結階段以後便是可以執行的**了。
直接生成可執行**
gcc test.c
會自動生成a.out檔案 這個檔案可以直接執行
生成指定檔名的可執行檔案
gcc test.c -o test
會生成test的可執行檔案
只對檔案程序預處理
gcc test.c -o test.i -e
生成乙個test.i的檔案,這個檔案包含指定標頭檔案的內容
生成彙編檔案
gcc test.i -s -o test.s
生成乙個彙編表示的檔案
生成目標檔案
gcc test.s -c test.o
生成乙個二進位制的目標檔案 這個檔案不能直接執行 因為沒有進行鏈結
生成可執行檔案
gcc test.o -o test
生成可執行檔案
在預處理階段需要將標頭檔案的內容插入到源**中,系統預設搜尋的路徑是/usr/include,大部分標頭檔案都在這個檔案中,在原始檔中包含的方式為這種形式預設是搜尋的這個路徑,還有一種包含方式 "head.h"這種形式預設是搜尋的本目錄,有的時候可以直接指定要包含的標頭檔案eg:gcc test.c -o test -l dir 表示在指定的目錄下搜尋標頭檔案。
在linux下使用make命令會執行makefile檔案
makefile檔案的編寫規則
test: mid.o add.o test.o //生成的檔案test後面是依賴的檔案
gcc mid.o add.o test.o -o test //執行的命令 鏈結操作
test.o: test.c am.h
gcc test.c -c -o test.o
mid.o: mid.c
gcc mid.c -c -o mid.o
add.o: add.c
gcc add.c -c -o add.o
看下面乙個例子
test.c
#include"am.h"
#includeint main()
mid.c
int mid(int a,int b)
add.c
int add(int a,int b)
am.h
int add(int a,int b);
int mid(int a,int b);
makefile
test: mid.o add.o test.o //生成的檔案test後面是依賴的檔案
gcc mid.o add.o test.o -o test //執行的命令 鏈結操作
test.o: test.c am.h
gcc test.c -c -o test.o
mid.o: mid.c
gcc mid.c -c -o mid.o
add.o: add.c
gcc add.c -c -o add.o
執行結果:
sun@ubuntu:~/project$ make
gcc mid.c -c -o mid.o
gcc add.c -c -o add.o
gcc test.c -c -o test.o
gcc mid.o add.o test.o -o test
make執行過程:
在輸入make命令時會自動尋找makefile或者makefile檔案
在執行第一條命令之前會檢查依賴的檔案是否存,在當依賴的檔案不存在時會先生成需要的依賴檔案。
當我們更新乙個已將編譯好的工程時,再執行make命令,會檢查依賴檔案更新的時間是否比生成目標的時間晚,如果比目標的時間晚時會執行編譯操作,表示這個檔案更新了需要重新生成。
Linux下的編譯器gcc的使用
首先了解編譯器在對 編譯的時候有以下的階段 1.預處理 進行巨集替換 2.編譯 生成彙編 3.彙編 生成機器可識別 也就是編譯成目標檔案 4.連線 生成可執行檔案或庫檔案 假設我寫了乙個test.c檔案,示例 第一階段 gcc e test.c o test.i 第二階段 gcc s test.i ...
Linux 下的 gcc, g 編譯器
linux自帶gcc 和 g 的 gcc引數詳解 gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 3.有彙編變為目標 機器 生成.o的檔案 4.連線目標 生成可執行程式 ...
Linux下gcc編譯器和g 編譯器的那些事兒
使用c c 程式設計大約有三四個年頭了。最開始涉及到微控制器 嵌入式linux等,都使用的是c語言,那時主要寫linux驅動,甚至在arm板上寫linux應用程式時需要應用物件導向的思想的時候,都是使用c語言的結構體和函式指標來實現。當然,使用的編譯器自然就是gcc了。後來,慢慢的轉向了使用c 編寫...