常見 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.
「其他文章」