《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > arm-linux-gcc 常用參數(shù)講解 gcc編譯器使用方法

arm-linux-gcc 常用參數(shù)講解 gcc編譯器使用方法

2015-09-18
關(guān)鍵詞: arm-linux-gcc 編譯器

  我們需要編譯出運行在ARM平臺上的代碼,,所使用的交叉編譯器arm-linux-gcc,。下面將arm-linux-gcc編譯工具的一些常用命令參數(shù)介紹給大家,。
  在此之前首先介紹下編譯器的工作過程,,在使用GCC編譯程序時,,編譯過程分為四個階段:
  1. 預(yù)處理(Pre-Processing)
  2. 編譯(Compiling)
  3. 匯編(Assembling)
  4. 鏈接(Linking)
  Linux程序員可以根據(jù)自己的需要讓 GCC在編譯的任何階段結(jié)束,,以便檢查或使用編譯器在該階段的輸出信息,或者對最后生成的二進(jìn)制文件進(jìn)行控制,,以便通過加入不同數(shù)量和種類的調(diào)試代碼來為 今后的調(diào)試做好準(zhǔn)備,。和其它常用的編譯器一樣,GCC也提供了靈活而強(qiáng)大的代碼優(yōu)化功能,,利用它可以生成執(zhí)行效率更高的代碼,。
  以文件example.c為例說明它的用法
  0. arm-linux-gcc -o example example.c
  不加-c、-S,、-E參數(shù),,編譯器將執(zhí)行預(yù)處理,、編譯、匯編,、連接操作直接生成可執(zhí)行代碼,。
  -o參數(shù)用于指定輸出的文件,輸出文件名為example,如果不指定輸出文件,,則默認(rèn)輸出a.out
  1. arm-linux-gcc -c -o example.o example.c
  -c參數(shù)將對源程序example.c進(jìn)行預(yù)處理,、編譯、匯編操作,,生成example.0文件
  去掉指定輸出選項"-o example.o"自動輸出為example.o,所以說在這里-o加不加都可以
  2.arm-linux-gcc -S -o example.s example.c
  -S參數(shù)將對源程序example.c進(jìn)行預(yù)處理,、編譯,生成example.s文件
  -o選項同上
  3.arm-linux-gcc -E -o example.i example.c
  -E參數(shù)將對源程序example.c進(jìn)行預(yù)處理,,生成example.i文件(不同版本不一樣,,有的將預(yù)處理后的內(nèi)容打印到屏幕上)
  就是將#include,#define等進(jìn)行文件插入及宏擴(kuò)展等操作,。
  4.arm-linux-gcc -v -o example example.c
  加上-v參數(shù),,顯示編譯時的詳細(xì)信息,編譯器的版本,,編譯過程等,。
  5.arm-linux-gcc -g -o example example.c
  -g選項,加入GDB能夠使用的調(diào)試信息,使用GDB調(diào)試時比較方便,。
  6.arm-linux-gcc -Wall -o example example.c
  -Wall選項打開了所有需要注意的警告信息,,像在聲明之前就使用的函數(shù),聲明后卻沒有使用的變量等,。
  7.arm-linux-gcc -Ox -o example example.c
  -Ox使用優(yōu)化選項,,X的值為空、0,、1,、2、3
  0為不優(yōu)化,,優(yōu)化的目的是減少代碼空間和提高執(zhí)行效率等,,但相應(yīng)的編譯過程時間將較長并占用較大的內(nèi)存空間。
  8.arm-linux-gcc   -I /home/include -o example example.c
  -Idirname: 將dirname所指出的目錄加入到程序頭文件目錄列表中,。如果在預(yù)設(shè)系統(tǒng)及當(dāng)前目錄中沒有找到需要的文件,,就到指定的dirname目錄中去尋找。
  9.arm-linux-gcc   -L /home/lib -o example example.c
  -Ldirname:將dirname所指出的目錄加入到庫文件的目錄列表中,。在默認(rèn)狀態(tài)下,,連接程序ld在系統(tǒng)的預(yù)設(shè)路徑中(如/usr/lib)尋找所需要的庫文件,這個選項告訴連接程序,,首先到-L指定的目錄中去尋找,,然后再到系統(tǒng)預(yù)設(shè)路徑中尋找,。
  10.arm-linux-gcc -static -o libexample.a example.c
  靜態(tài)鏈接庫文件
  gcc在命令行上經(jīng)常使用的幾個選項是:
  -c   只預(yù)處理、編譯和匯編源程序,,不進(jìn)行連接,。編譯器對每一個源程序產(chǎn)生一個目標(biāo)文件。
  -o file  確定輸出文件為file,。如果沒有用-o選項,,缺省的可執(zhí)行文件的輸出是a.out,目標(biāo)文件和匯編文件的輸出對source.suffix分別是source.o和source.s,,預(yù)處理的C源程序的輸出是標(biāo)準(zhǔn)輸出stdout,。
  -Dmacro或-Dmacro=defn   其作用類似于源程序里的#define。例如:% gcc -c -DHAVE_GDBM -DHELP_FILE=\"help\" cdict.c其中第一個- D選項定義宏HAVE_GDBM,,在程序里可以用#ifdef去檢查它是否被設(shè)置,。第二個-D選項將宏HELP_FILE定義為字符串“help”(由于反斜線的作用,引號實際上已成為該宏定義的一部分),,這對于控制程序打開哪個文件是很有用的,。
  -Umacro   某些宏是被編譯程序自動定義的。這些宏通??梢灾付ㄔ谄渲羞M(jìn)行編譯的計算機(jī)系統(tǒng)類型的符號,,用戶可以在編譯某程序時加上 -v選項以查看gcc缺省定義了哪些宏。如果用戶想取消其中某個宏定義,,用-Umacro選項,,這相當(dāng)于把#undef macro放在要編譯的源文件的開頭。
  -Idir   將dir目錄加到搜尋頭文件的目錄列表中去,,并優(yōu)先于在gcc缺省的搜索目錄,。在有多個-I選項的情況下,按命令行上-I選項的前后順序搜索,。dir可使用相對路徑,,如-I../inc等。
  -O   對程序編譯進(jìn)行優(yōu)化,,編譯程序試圖減少被編譯程序的長度和執(zhí)行時間,,但其編譯速度比不做優(yōu)化慢,而且要求較多的內(nèi)存,。
  -O2   允許比-O更好的優(yōu)化,,編譯速度較慢,,但結(jié)果程序的執(zhí)行速度較快,。
  -g   產(chǎn)生一張用于調(diào)試和排錯的擴(kuò)展符號表。-g選項使程序可以用GNU的調(diào)試程序GDB進(jìn)行調(diào)試,。優(yōu)化和調(diào)試通常不兼容,,同時使用-g和-O(-O2)選項經(jīng)常會使程序產(chǎn)生奇怪的運行結(jié)果,。所以不要同時使用-g和-O(-O2)選項。
  -fpic或-fPIC   產(chǎn)生位置無關(guān)的目標(biāo)代碼,,可用于構(gòu)造共享函數(shù)庫,。
  以上是gcc的編譯選項。gcc的命令行上還可以使用連接選項,。事實上,,gcc將所有不能識別的選項傳遞給連接程序ld。連接程序ld將幾個目標(biāo)文件和庫程序組合成一個可執(zhí)行文件,,它要解決對外部變量,、外部過程、庫程序等的引用,。但我們永遠(yuǎn)不必要顯式地調(diào)用ld,。利用gcc命令去連接各個文件是很簡單的,即使在命令行里沒有列出庫程序,,gcc也能保證某些庫程序以正確的次序出現(xiàn),。
  gcc的常用連接選項有下列幾個:
  -Ldir   將dir目錄加到搜尋-l選項指定的函數(shù)庫文件的目錄列表中去,并優(yōu)先于gcc缺省的搜索目錄,。在有多個-L選項的情況下,,按命令行上-L選項的前后順序搜索。dir可使用相對路徑,。如-L../lib等,。
  -lname   在連接時使用函數(shù)庫libname.a,連接程序在-Ldir選項指定的目錄下和/lib,,/usr/lib目錄下尋找該庫文件,。在沒有使用-static選項時,如果發(fā)現(xiàn)共享函數(shù)庫libname.so,,則使用libname.so進(jìn)行動態(tài)連接,。
  -static   禁止與共享函數(shù)庫連接。
  -shared   盡量與共享函數(shù)庫連接

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。