簡 述: 在 uinx/Linux 下,使用 gcc 的工作流程:預處理,編譯,彙編,鏈接。 這裏實際測試,舉例分析:使用 g++(用 c++)的編譯 main.cpp ,最終得到可執行程序的過程分析。
編程環境:
💻: MacOS 10.14.6 (18G103)
📎 gcc/g++ 9.2.0
gcc工作流程:
-
預處理(
gcc -E
; 預處理器cpp) :xxx.c --> xxx.i
(.i 文件本質還是.c 文件)- 宏替換
- 頭文件展開
- 註釋去掉
-
編譯(
gcc -S
; 編譯器 gcc):xxx.i --> xxx.s
- 生成彙編文件
-
彙編(
gcc -c
; 彙編器as):xxx.s --> xxx.o
- 生成二進制文件
-
鏈接(
gcc
; 鏈接器ld)xxx.o --> xxx(可執行)
gcc常用參數:
-v/--version:
查看版本-I:
指定包含頭文件路徑(推薦相對路徑)-c:
彙編文件生成二進制文件-o:
指定生成文件的名字-g:
gcc調試時候,添加的參數-D:
編譯的時候,生成一個你所指定的宏(場景:多使用在測試程序中)-Wall:
gcc 編譯時候,添加顯示警告⚠️信息-On:
優化代碼,n 是優化級別:1,2,3(3 就是最大,填寫 100 也是 3)
例子驗證:
-
創建c++源文件:
創建一個 main.cpp 的源文件,內容如下:
#include <iostream> int main(int argc, const char * argv[]) { // insert code here... std::cout << "Hello, World!\n"; return 0; }
-
gcc 預處理:
g++-9 -E main.cpp -o main.i
原始的 .cpp 文件:
-
gcc 編譯:
g++-9 -S main.i -o main.s
頭文件展開,宏替換,去掉註釋之後的 .cpp 文件。(.i 文件本質還是 .cpp 文件)
-
gcc 彙編:
g++-9 -c main.s -o main.o //-c 是小寫,非大寫C
生成的彙編文件:
-
gcc 鏈接:
g++-9 main.s -o main
生成的二進制文件(打開會看到亂碼):
-
運行可執行程序:
./main
終端看到輸出結果:Hello, World!