常見 GCC C++ 編譯選項
一個典型的 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.
「其他文章」