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...