常見 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.