C++ gcc編譯過程
- 2019 年 10 月 6 日
- 筆記
C++編譯過程主要分為,預處理、編譯、彙編、鏈接四個過程。如下圖所示:

第一步:預處理 將源代碼的.c 、.cpp 、.h 等文件包含到一個文件中。在這個過程中會使用一些預處理指令要求編譯器使用什麼樣的方式包含這些文件。預處理結束之後對於c語言編譯器會生成一個.i 文件。C++會生成.ii文件。
[新手略過]
預編譯過程主要處理那些源代碼中以#開始的預編譯指令,主要處理規則如下:
·將所有的#define刪除,並且展開所有的宏定義;
·處理所有條件編譯指令,如#if,#ifdef等;
·處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。該過程遞歸進行,及被包含的文件可能還包含其他文件。
·刪除所有的注釋//和 /**/;
·添加行號和文件標識,如#2 「hello.c」 2,以便於編譯時編譯器產生調試用的行號信息及用於編譯時產生編譯錯誤或警告時能夠顯示行號信息;
·保留所有的#pragma編譯器指令,因為編譯器須要使用它們;
第二步:編譯 編譯過程就是把預處理完的文件進行一系列詞法分析,語法分析,語義分析及優化後生成相應的彙編代碼文件.
第三步:彙編 彙編器是將彙編代碼轉變成機器可以執行的命令,每一個彙編語句幾乎都對應一條機器指令。彙編相對於編譯過程比較簡單,根據彙編指令和機器指令的對照表一一翻譯即可。
第四步:鏈接 鏈接器ld將各個目標文件組裝在一起,解決符號依賴,庫依賴關係,並生成可執行文件。
==操作演示==
本文以兩個簡單的代碼文件為例。
準備源代碼文件(demo.h,demo.cpp):
比如咱們在G盤創建一個code目錄用於保存文件。咱們把demo.h 、demo.cpp 。使用控制台命令 "dir /W" 查看文件夾下的文件信息。如下圖,圖中紅色標識是文件名。

==注意,如果希望清理當前屏幕內容。使用cls命令==

文件的具體如下: demo.h文件的內容
demo.cpp文件的內容
第一步:
使用預處理命令cpp將demo.cpp 文件進行預處理生成.ii預處理文件 。注意這裡的cpp命令不是C plus plus 而是C Preprocessor。.ii文件實際上是編譯器要處理的文件。文件內容包括.h頭文件和.cpp源代碼文件中的所有內容。生成預處理文件的方式有三種。 1.使用cpp 命令執行預編譯。將輸出內容轉移到文件中的方式。此處 > 符號表示輸出到文件。
執行命令後,查看目錄中的文件信息。
然後我們使用 del *.ii 的方式刪除生成的預處理 .ii 文件.
2.使用cpp 的-o 參數指定輸出文件名 。-E 參數指定輸入文件名。
執行命令後,查看目錄中的文件信息。
同樣使用 del *.ii刪除,預處理文件,我們嘗試第三種方式。 3.再cpp預處理的時候。輸入文件名可以不使用-E。
得到內容
可以看到此文件包含了 demo.h 、demo.cpp 中所有文件的內容。
圖示:
第二步:
使用編譯命令將預處理文件(.ii文件)編譯成彙編代碼。這裡有兩種方式供我們選擇。
1.使用編譯指令
可以看到此文件包含了 demo.h 、demo.cpp 中所有文件的內容。
圖示:
第二步:
使用編譯命令將預處理文件(.ii文件)編譯成彙編代碼。這裡有兩種方式供我們選擇。
1.使用編譯指令
注意這裡cc1是數字的1.不是字母l.並且cc1位於minGw安裝目錄下的 libexecgccmingw324.8.1 目錄下。並沒有默認在bin目錄下。需要注意配置。
此處生成後綴為.s 文件。為編譯生成的彙編代碼文件。
1.使用g++ 指令
得到結果如下圖。
上述兩種方式都會幫我們生成demo.s 的彙編代碼文件。我們可以查看一下文件中的內容。
下圖:
途中內容無法完全展示。下文是整個文件的內容。內容為彙編代碼,新手請忽略。老鳥慢品。
第三步:
使用彙編器將彙編代碼翻譯成機器代碼組成的目標文件。但是這部分機器代碼還不能夠直接執行。同樣有兩種方式
1.使用彙編器指令
2.g++ 調用連接器組裝可執行文件
執行後查看文件得到demo.exe文件。demo.exe 為連接器鏈接其他庫文件生成的windows 可執行文件。
當然,在g++編譯器編譯時也可以在控制台使用 –save-temps 參數保留編譯過程中的臨時文件。如下
執行後查看文件得到demo.exe文件。demo.exe 為連接器鏈接其他庫文件生成的windows 可執行文件。
當然,在g++編譯器編譯時也可以在控制台使用 –save-temps 參數保留編譯過程中的臨時文件。如下
執行後查看目錄中的文件信息如下圖:
咱們這裡主要講述了使用MinGw編譯C++程序的整個過程。一共涉及到4個過程,分別是預處理、編譯、彙編、鏈接等四個過程。預處理主要由預處理器cpp程序完成。編譯是將預處理完成生成的預處理文件編譯成彙編代碼的過程。主要由ccl 編譯程序完成。彙編是將文本形式的彙編語言代碼翻譯成二進制機器碼的過程。這個過程主要由彙編器as完成。鏈接主要由連接器將二進制對象文件和相關其他的靜態、動態鏈接庫打包生成操作系統可執行文件。MinGw主要提供的g++程序能夠幫助我們完成整個過程。也可以在某些步驟進行單獨操作。而且可以保留臨時文件等。
老九學堂出品