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