1. 程式人生 > 實用技巧 >Liunx之C/C++編譯流程解析

Liunx之C/C++編譯流程解析

前言

liunx 中沒有像windows下的visual stdio ide 之類的整合管理工具,所有我們需要自己使用指令碼的方式來對專案進行管理,如當前你需要一個
debug版本的專案可執行環境,那麼你需要一個專案構建debug可執行檔案的指令碼來生成它。釋出relese可執行檔案或環境時也是同理。

宣告

該文章由筆名為錢德勒老師指導,且由我整理輸出的,如果對文章中的內容敏感,請聯絡刪除。

/*
測試程式碼目錄 >> 
testting----
           |---- global.h
           |---- global.c
           |---- main.c
*/
目錄
Liunx 的程式編譯流程之 .i
/*
作用: 將 .h 檔案中的引用內容展開,並輸出為 .i 檔案
格式: sudo gcc -E -o [target.i] [source.c]
例子: sudo gcc -E -o main.i main.c 和 sudo gcc -E -o global.i global.c
解析: 
我們由圖 compile_main_file_i.png 和 compile_global_file_i.png 得知編譯器在預處理步驟做了以下內容 >> 
1. 前處理器在.cpp中遇到#include<> 或者 #include "",  都會將#include<> 或者 #include "" 指令替換為他們包含的標頭檔案中的內容,形成 .i檔案
2. 標頭檔案只在預處理期起作用,預處理過後生成  .i 檔案,此後標頭檔案就沒有作用了 
*/
compile_global_file_i.png

compile_main_file_i.png

Liunx 的程式編譯流程之 .s
/*
作用: 將 .i 檔案中的程式碼進行編譯,並輸出為 .s 的彙編檔案
格式: sudo gcc -S [source.c]
例子: sudo gcc -S main.c 和 sudo gcc -S main.c
解析: 
我們由圖 compile_global_file_s.png 和 compile_main_file_s.png 得知以下內容 >> 
1. 編譯器將 .i 檔案中的程式碼編譯成了 .s 彙編程式碼,但是這個程式碼對於人類而言,還是勉強能夠看得懂的
2. 編譯器將預編譯檔案轉換為彙編檔案,在這個步驟將優化掉預編譯步驟中的所有的預處理西資訊
*/
compile_global_file_s.png

compile_main_file_s.png

Liunx 的程式編譯流程之 .o
/*
作用: 將 .s 檔案中的程式碼進行編譯,並輸出為 .o 的二進位制檔案
格式: sudo gcc -c -o [target.o] [file.s]
例子: sudo gcc -c -o global.o global.s 和 sudo gcc -c -o main.o main.s
解析: 
我們由圖 compile_file_o.png 得知以下內容 >> 
1. 編譯器將 .s 檔案編譯成了二進位制程式碼檔案了
2. 這種檔案對於正常的人類來說,是看不懂的,編譯器對於程式來說,在這個步驟就完成了
3. 這個檔案會以匯入點、匯出點、資料段、程式碼段等資訊組成
4. 如果你有興趣的話,可以用二進位制的方式開啟這個文字,然後去轉換為彙編程式碼,當然我是不會那樣去做的,原因很多
*/
compile_file_o.png

Liunx 的程式編譯流程之 .elf
/*
作用: 將多個 .o 檔案中的程式碼進行連結,並輸出為 .elf 的可執行檔案
格式: sudo gcc -o [target] [files.o]
例子: sudo gcc -o testting global.o main.o
解析: 
1. 可執行就對了
2. 它會將每一個 .o 檔案對應的匯入點、匯出點、資料段、程式碼段等資訊按照一定的順序合併到 .elf 檔案中
*/