gcc的編譯選項總結

2021-10-07 17:29:07 字數 2421 閱讀 4665

3 arm架構專有的編譯選項

參考文獻

本文用於記錄我在學習和工作中遇到的各種gcc選項,雖然這些選項可以在gnu的手冊上查到,不過這裡做個總結,可以避免每次都去查手冊,算是乙個備忘吧。本文的內容會不斷更新擴充。

選項作用

-o指定輸出檔名稱

-e只進行預處理

-s只進行預處理、編譯

-c只預處理、編譯、彙編,但不鏈結

-d使用-d name[=definition]預定義名為name的巨集,若不指定值則預設巨集的內容為1

-l(小寫的l)

使用-l libname或者-llibname,使鏈結器在鏈結時搜尋名為libname.a/libname.so(靜態/動態)的庫檔案

-l使用-ldir新增搜尋目錄,即鏈結器在搜尋-l選項指定的庫檔案時,除了系統的庫目錄還會(優先)在-l指定的目錄下搜尋

-i(大寫的i)

使用-i dir,將目錄dir新增為標頭檔案搜尋目錄

-include

使用-include file,等效於在被編譯的原始檔開頭新增#include "file"

-static

指定靜態鏈結(預設是動態鏈結)

-o0~3

開啟編譯器優化,-o0為不優化,-o3為最高端別的優化

-os優化生成**的尺寸,使能所有-o2的優化選項,除了那些讓**體積變大的

-og優化除錯體驗,在保留除錯資訊的同時保持快速的編譯,對於生成可除錯**,比-o0更合適,不會禁用除錯資訊。

-wall

使編譯器輸出所有的警告資訊

-march

指定目標平台的體系結構,如-march=armv4t,常用於交叉編譯

-mtune

指定目標平台的cpu以便gcc優化,如-mtune=arm9tdmi,常用於交叉編譯

通常gcc通過原始檔的字尾來判斷該原始檔是由什麼語言編寫的(雖然linux中字尾沒有意義),換句話說,如果我們的檔名不帶字尾,那麼gcc就無法判斷原始檔的語言型別了,也就無法完成編譯。舉例來說:

例1

我用c語言編寫了一段**,將其儲存在檔名為main.lll中,執行gcc main.lll會報錯:

main.lll: file not recognized: file format not recognized

collect2: error: ld returned 1 exit status

例2在u-boot中,生成鏈結指令碼的命令為arm-linux-gcc -e -wp,-md,./.u-boot.lds.d ...... -x assembler-with-cpp -std=c99 -p -o u-boot.lds arch/arm/cpu/u-boot.lds,如果把其中的-x assembler-with-cpp去掉,則編譯器給出如下資訊(且不會生成鏈結指令碼):

linker input file unused because linking not done
至此,-x language的作用就很好理解了,當我們的原始檔不新增常規的字尾時,使用該選項來告訴gcc原始檔使用了哪種程式語言,其中的language表明的就是語言型別,其可取的值有(不是全部):

c c-header cpp-output c++ c+±header c+±cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c+±header objective-c+±cpp-output assembler assembler-with-cpp

這裡所說的鏈結器是指整合在可執行檔案gcc中的鏈結器,而不是單獨使用的ld。當我們通過gcc間接使用鏈結器時,需要在鏈結器的編譯選項前面加上-wl,,然後跟著編譯選項,即標題中的options。gcc手冊中的相應介紹如下:

那麼,為什麼需要-wl,字首呢?gnu的鏈結器手冊中是這樣解釋的(很好懂,就不翻譯了):

[1] gnu官方文件

GCC編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...

gcc 編譯選項

gcc 編譯選項,自己翻譯的.gcc 編譯選項,自己翻譯的.o 設定輸出檔名 c 只編譯,不連線.e 只做預編譯.pipe 在多個編譯過程之間使用管道.version 顯示版本.static 靜態連線.ansi c 模式下支援所有 iso c90 標準的 c 程式,c 模式下去除對 gnu c 擴充...

gcc 編譯選項

wall 大部分警告 wextra 一些額外的警告 werror 當出現警告時轉為錯誤,停止編譯 wconversion 一些可能改變值的隱式轉換,給出警告。wno unused parameter 函式中出現未使用的引數,不給出警告。wold style cast c風格的轉換,給出警告 wove...