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