gcc工作流程:預處理,編譯,彙編,鏈接


  簡 述: 在 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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章