與 GCC 一起編譯

假設一個名為 main.cpp 的原始檔,編譯和連結未優化的可執行檔案的命令如下(沒有優化的編譯對於初始開發和除錯很有用,儘管 -Og 正式推薦用於較新的 GCC 版本)。

g++ -o app -Wall main.cpp -O0

要生成用於生產的優化可執行檔案,請使用 -O 選項之一(請參閱: -O1-O2-O3-Os-Ofast ):

g++ -o app -Wall -O2 main.cpp

如果省略 -O 選項,則使用 -O0(這意味著不進行優化)作為預設值(指定 -O 而不將數字解析為 -O1)。

或者,直接使用 O 組(或更多實驗優化)的優化標記。以下示例使用 -O2 優化構建,加上 -O3 優化級別的一個標誌:

g++ -o app -Wall -O2 -ftree-partial-pre main.cpp

要生成特定於平臺的優化可執行檔案(用於具有相同體系結構的計算機上的生產),請使用:

g++ -o app -Wall -O2 -march=native main.cpp

上述任何一個都會生成一個二進位制檔案,可以在 Windows 上執行 .\app.exe,在 Linux,Mac OS 等執行 ./app

-o 標誌也可以跳過。在這種情況下,GCC 將在 Windows 上建立預設輸出可執行檔案 a.exe,在類 Unix 系統上建立 a.out。要編譯檔案而不連結它,請使用 -c 選項:

g++ -o file.o -Wall -c file.cpp

這會生成一個名為 file.o 的目標檔案,以後可以將其與其他檔案連結以生成二進位制檔案:

g++ -o app file.o otherfile.o

有關優化選項的更多資訊,請訪問 gcc.gnu.org 。特別值得注意的是 -Og(優化強調除錯經驗 - 推薦用於標準編輯 - 編譯 - 除錯迴圈)和 -Ofast(所有優化,包括無視嚴格標準合規的優化)。

-Wall 標誌啟用警告,許多常見的錯誤,應始終使用。為了提高程式碼質量,通常還鼓勵使用 -Wextra 和其他警告標誌,這些標誌不是由 -Wall-Wextra 自動啟用的。

如果程式碼需要特定的 C++標準,請通過包含 -std= 標誌來指定要使用的標準。支援的值對應於每個 ISO C++標準版本的最終確定年份。從 GCC 6.1.0 開始,std= 標誌的有效值為 c++98 / c++03c++11c++14c++17 / c++1z。由正斜槓分隔的值是等效的。

g++ -std=c++11 <file>

GCC 包括一些特定於編譯器的擴充套件,當它們與 -std= 標誌指定的標準衝突時被禁用。要在啟用所有擴充套件的情況下進行編譯,可以使用值 gnu++XX,其中 XX 是上面列出的 c++值使用的任何年份。

如果未指定,則將使用預設標準。對於 6.1.0 之前的 GCC 版本,預設為 -std=gnu++03; 在 GCC 6.1.0 及更高版本中,預設為 -std=gnu++14

請注意,由於 GCC 中的錯誤,-pthread 標誌必須出現在 GCC 的編譯和連結中,以支援 C++ 11 引入的 C++標準執行緒功能,例如 std::threadstd::wait_for。在使用執行緒函式時省略它可能會導致沒有警告,但在某些平臺上會產生無效結果

與庫聯絡:

使用 -l 選項傳遞庫名稱:

g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)

如果庫不在標準庫路徑中,請使用 -L 選項新增路徑:

g++ main.cpp -L/my/custom/path/ -lmylib

多個庫可以連結在一起:

g++ main.cpp -lmylib1 -lmylib2 -lmylib3

如果一個庫依賴於另一個庫,則將依賴庫放在獨立庫之前

g++ main.cpp -lchild-lib -lbase-lib

或者讓連結器通過 --start-group--end-group 確定排序本身(注意:這有很大的效能成本):

g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group