GCC 驅動程式與工具鏈

最後更新: 2021-06-21 17:17:24 +0800 +0800
原文以英文撰寫。您正在閱讀AI翻譯版本。

gcc 與 g++ 是 GCC 驅動程式。它們會根據輸入副檔名與選項選取語言前端、執行前處理與編譯、呼叫組譯器,並協調連結器。GCC 手冊 是權威來源,因為確切預設值取決於設定的目標與 GCC 發行版本。

驅動程式階段與語言預設值 #

對於原始檔,驅動程式可以在前處理(-E)、編譯為組合語言(-S),或組譯為物件檔(-c)後停止。沒有停止選項時,它會連結產生的物件與函式庫。

bash
g++ -std=c++20 -O2 -Wall -Wextra -c source.cc -o source.o
g++ source.o -o program

g++ 會為相關輸入選取 C++ 處理方式,並在連結時自動加入 C++ 執行階段函式庫。因此,即使物件檔是分開編譯的,C++ 程式的最後連結仍應使用 g++。gcc 是以 C 為導向的驅動程式;傳遞 -x c++ 會變更輸入語言,但本身不會提供 g++ 的 C++ 連結預設值。

使用 -v 在執行期間列印驅動程式活動。使用 -### 列印驅動程式將執行的命令而不實際執行。-print-prog-name=cc1plus、-print-search-dirs 與 -dumpspecs 會公開設定的程式、搜尋路徑與驅動程式規格,適合診斷,不適合可攜式建置邏輯。

相依性與中間檔案 #

從編譯器產生標頭檔相依性:

make
CPPFLAGS += -MMD -MP
OBJECTS := main.o parse.o

-include $(OBJECTS:.o=.d)

-MMD 產生使用者標頭檔相依性,同時省略系統標頭檔;-MP 為之後可能移除的標頭檔加入虛擬目標。使用 -MF 選擇相依性檔案,並使用 -MT 或 -MQ 控制其目標。當需要檢查某個階段時,-save-temps 會保留前處理與組合語言中間檔案。

連結、規格與搜尋路徑 #

驅動程式會將規格展開為命令,選取啟動物件、libgcc、語言執行階段與連結器。-specs=file 會變更該展開內容,是工具鏈設定機制,而不是一般專案選項。

-Bprefix 會變更從屬程式與相關檔案的搜尋前綴。--sysroot=dir 會為交叉工具鏈重新定位目標標頭檔與函式庫。-I 影響標頭檔查找;-L 加入函式庫目錄;-lname 選取函式庫。對傳統靜態封存檔而言,連結順序很重要,因此應將封存檔放在參照它的物件檔之後。透過 -Wl,option 傳遞連結器特定選項,並將建置系統目標設定與主機預設值分開。

診斷與可重現的呼叫 #

啟用已記錄的警告政策,只有在專案能跨支援的編譯器維護該政策時,才使用 -Werror= 提升選定警告。使用 -g 加入偵錯資訊;請刻意選擇最佳化等級,因為最佳化會改變程式碼產生方式,並可能暴露未定義行為。

GCC 可以以已設定的格式輸出機器可讀診斷,但可用性會隨發行版本變更。在讓 JSON、SARIF、色彩或路徑格式輸出成為 CI 契約前,請查詢 gcc --help=common 與相符的已安裝手冊。失敗建置記錄應保留完整驅動程式呼叫、編譯器版本、目標三元組與相關環境,因為每項都會參與有效工具鏈。

評論

在 GitHub 上閱讀或評論(發表評論需要登入)