常見 GCC C++ 編譯選項

語言: CN / TW / HK

一個典型的 GCC C++編譯過程為:

g++ hello.cpp -c -o hello.o -I /opt/include -isystem /usr/include 
g++ hello.o -o hello -L /opt/include -l folly -l boost_system

這兩步可以簡化到一步:

g++ hello.cpp -o hello  -I /opt/include -isystem /usr/include -L /opt/include -l folly -l boost_system

1. 路徑和連結庫

涉及如下引數:

  • -I#include 包含標頭檔案時,標頭檔案的查詢路徑。將依次查詢。
  • -isystem#include <header> 包含標頭檔案時,標頭檔案的查詢路徑(優先順序在 -I 之後)。而且 將不顯示這些標頭檔案裡出現的警告 (反正也無法修改)。
  • -l :需要連結的庫。
  • -L :連結庫所在路徑。
  • -Wl,rpath : 需要新增到 程式 RUNPATH 的路徑

如果用到多執行緒,需要新增選項 -pthread

2. 巨集和優化級別

-DMACRO 或者 -DMACRO=value 可以指定巨集。其中最終要的一個是 -DNDEBUG ,用於取消生產版本里的 assert 指令(注意 -g 並不會取消 assert 指令)。

-g 則用於生成 debug 資訊, -O0-O1-O2-O3 則是不同的優化級別。

我們在編譯時經常會碰到 make release 或者 make debug ,事實上它們分別是上面指令的組合:

-DNDEBUG -O2
-g -O0

3. 錯誤資訊相關

gcc 可根據選項,顯示具體的編譯警告和錯誤:

  • -Wall :大部分常見的警告資訊。
  • -Wextra :比 -Wall 更多的警告資訊。
  • -Werror :將警告視作錯誤,會阻止編譯進行,對大多數情況下過於嚴厲。
  • -pedantic : ANSI/ISO C 標準所列出的所有警告。
  • -Wwarning-type :提示具體的警告型別。
  • -Wno-warning-type :不提示具體的警告型別。

常用的一個組合為: -Wall -Wextra -pedantic -Werror=return-type -Winvalid-pch -Wno-unused-parameter

4. 其它選項

  • --std=c++11 :指定 C++版本。可用 c++1z
  • -MD :會生成 .d 依賴檔案,記錄標頭檔案的依賴關係,方便編譯器根據修改情況來決定是否需要重新編譯。通常會加上。
  • -pipe :中間檔案直接放在記憶體,而不是顯式的臨時檔案。通常會加上。
  • -fPIC : 生成動態連結庫的目標檔案時,必須新增該選項。生成靜態庫,但被其它動態庫時用時,也需要新增該選項。
  • -share :表示生成的目標檔案為動態連結庫。
  • -m64 :生成 64 位應用程式。

Q. E. D.