與 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++03
,c++11
,c++14
和 c++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::thread
和 std::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