GCC(GNU Compiler Collection,GNU編譯器套件)是由GNU開發的編程語言譯器。
對于 C 語言源代碼文件,使用 GCC 生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟:預處理(Preprocessing)、編譯(Compilation)、匯編(Assembly)和鏈接(Linking)。
GCC 的編譯選項有很多,在開發階段,經常使用一些有用的警告選項來排查常見的代碼 Bug,同時也是是檢查代碼正確性、提高代碼魯棒性的重要手段。
GCC 有很多編譯選項,按照不同選項的功能劃分,可以分為三類:
調試代碼;
對目標文件進行優化;
檢查代碼質量。
下面是一個GCC常用的編譯選項示例:
CFLAGS := -Wall -Wundef -Wshadow -Wconversion -Werror=return-type \ -Werror=implicit-function-declaration -Werror=unused-variable \ -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \ -Wno-trigraphs -Os
對于調試版本,可將 -Os 替換為 -g -Og。
1、調試選項
為了能夠正常使用 GDB 調試器調試程序,需要讓編譯器給編譯目標添加額外的調試信息。
最常使用的就是 -g。
如果為了提升一些調試程序的性能,可以配合使用針對調試的優化選項 -Og。
2、優化選項
優化選項用于控制編譯器對代碼的優化等級,常用的是 -O2 和 -Os。
-O0:默認選項,不執行任何優化;
-Og:針對調試的優化選項,它會啟用 -O1 的優化指令,同時獲取到更多的調試信息;
-O1:執行級別1的優化,嘗試減少代碼大小和提高性能,比如 -fdce(移除不可能執行到的代碼),-fif-conversion(嘗試簡化if語句),-fmerge-constants(嘗試合并相同的常量)。但是不包括需要花費大量編譯時間的優化選項;
-O2:執行 -O1 所有優化選項,同時額外執行幾乎全部不需要在空間和性能之間平衡的優化選項。比如 -fgcse(優化全局公共表達式、常量的傳遞),-fcode-hoisting(將所有分支都需要執行的表達式盡早執行),-finline-functions(考慮將所有函數變成內聯函數);
-Os:專門用于優化代碼大小的優化級別,執行 -O2 所有優化選項,同時排除那些可能導致程序大小增加的優化選項;
-O3:最高優化等級,該優化級別較高,執行的優化不會很直觀,可能也會出現一些問題,需要看實際情況選擇是否使用。
3、警告選項
GCC編譯器支持對代碼進行診斷,針對代碼中疑似錯誤或者可能存在風險的地方發出警告,警告編譯選項就是用來控制需要告警的警告類型的。
-Wall:常用的編譯選項,用于啟用一批比較常見且易于修改的警告,對代碼進行基本的檢查;
-Wextra:單有 -Wall 可能還不夠嚴格,-Wextra 作為補充,包括一些沒有被 -Wall 包含的警告類型;
-Werror:用于將所有警告視為錯誤。
一般啟用特定類型警告的格式為 -Wxxx,排除特定類型的警告的格式為 -Wno-xxx。比如使用 -Wall -Wno-unused-variable 可以從- Wall 中排除 -Wunused-variable。
如果希望某些類型的警告被視為錯誤,可以使用 -Werror=xxx,比如-Werror=switch;反之,則可以使用 -Wno-error=xxx 不將該類型警告視為錯誤,比如 -Wno-error=switch。
常見的警告選項如下圖所示。
還木有評論哦,快來搶沙發吧~