Linux下C編譯的步驟

2021-10-02 07:07:54 字數 1966 閱讀 8683

來自《linuxc程式設計一站式學習》

其中main.s是main.c對應的彙編**,main.o是目標檔案,a.out是可執行檔案。可以看到圖中每種檔案都有相應的指令來生成a.out可執行檔案。我們以main.c為例,依次生成main.s,main.o.a.out

我們先編寫乙個簡單的.c檔案,儲存為main.c檔案

使用$gcc -e main.c -o pre_main.c來預處理.c檔案,這一步生成的pre_main.c檔案是預處理之後,編譯之前的檔案

其中-o命令選項是重新命名檔案,如果我們不加-o指定重新命名檔案,預處理後的檔案就會直接列印到終端上

進到pre_main.c檔案裡面看,可以看到這一步把stdio.h中內容在pre_main.c中展開了。其實這一步主要做了這些事

1. 把頭檔案展開

2. 執行預處理指令,如#define n 20,這一步就會把**中的n替換成它的定義值20

這一步是可有可無的,所以在一開始的圖中沒有寫出-e指令。

使用$gcc -s main.c -o main.s來生成c對應的彙編**,再進入main.s中檢視,就全是彙編指令了。(如果你使用$gcc -s pre_main.c -o pre_main.s也可以生成彙編**)

這裡如果不加-o,就會生成預設的檔名main.s,預設檔名格式都是(***x.c,***x.s,***x.o,a.out),加了-o只是為了看起來更清晰一點

執行$gcc -c main.s -o main.o生成main.o目標檔案。觀察圖我們發現也可以使用$gcc -c main.c -o main.o直接生成此目標檔案

進到main.o裡面就發現全是亂碼了,其實這裡的.o檔案的內容就是二進位制資料,main.o是目標檔案,還不能執行

.o檔案也就是目標檔案,.o檔案是只經過編譯而還沒有經過鏈結的檔案,此時**中的位址均是虛擬位址。

至於目標檔案是什麼型別的檔案,我們可以用$file main.o來檢視,發現是elf檔案(後面會補充,這裡先不展開)

執行$gcc main.o -o main命令,生成可執行檔案main,再使用./main就可以執行該程式了

這一步就是把鏈結檔案,生成可執行檔案

至此,一次從main.c到main的編譯過程就完成了。

我們對main.o和main分別使用file命令檢視檔案型別時,main會多出一些描述資訊,和dynamically linked

原因是main.o只是由彙編**生成的目標檔案,此時還不能執行,main檔案是經過鏈結後的檔案,通過鏈結把各種執行時的檔案鏈結起來,這時main才能執行

linux下編譯C C 的步驟

常規操作 e 讓gcc在預處理結束後停止編譯 g e hello.cpp o hello.i c 將hello.i編譯成目標 g c hello.i o hello.o 將目標檔案連線成可執行檔案 g hell.o o hello g main.cpp o main main是執行檔案 對於兩個以上...

linux 編譯c 步驟

直接在命令列中寫入 apt get install g 需取得 root 許可權 取得 root 許可權 ubuntu su r red hat su root suse su root如果上一部出錯,請嘗試寫入 apt get update 待完成之後再寫入 apt get install g 應...

linux下的c 編譯

end目前在linux上,c 的編譯主要依賴於gcc,而gcc實際上並不是乙個編譯器,其全稱為gnu compiler collection,即gnu的編譯器集合,可以通過它來編譯c c object c等各種語言的原始碼。其中gcc是gcc中的gnu c compiler c編譯用 g 即為gcc...