<th id="ndjcx"></th>
    <span id="ndjcx"></span>
  • gcc的常用編譯選項

    admin 146 0

    gcc的常用編譯選項 母嬰 第1張

    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。

    常見的警告選項如下圖所示。

    gcc的常用編譯選項 母嬰 第2張

    發表評論 (已有0條評論)

    還木有評論哦,快來搶沙發吧~