Liunx之C/C++編譯流程解析
阿新 • • 發佈:2020-12-05
前言
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 檔案中
*/