編譯:
第一步、是進(jìn)行預(yù)編譯,使用-E參數(shù)可以讓GCC在預(yù)處理結(jié)束后停止編譯過(guò)程:
gcc -E hello.c -o hello.i
預(yù)處理的宏定義插入到hello.i中
第二步、是將hello.i編譯為目標(biāo)代碼,這可以通過(guò)使用-c參數(shù)來(lái)完成:
gcc -c hello.i -o hello.o
也可以通過(guò)源文件直接生成
gcc -c hello.c
第三步、是將生成的目標(biāo)文件鏈接成可執(zhí)行文件:
gcc hello.o -o hello
也可以通過(guò)源文件直接生成
gcc -o hello hello.c
警告:
1、-pedantic 選項(xiàng),那么使用了擴(kuò)展語(yǔ)法的地方將產(chǎn)生相應(yīng)的警告信息
2、-Wall 使用它能夠使GCC產(chǎn)生盡可能多的警告信息
3、-Werror,它要求GCC將所有的警告當(dāng)成錯(cuò)誤進(jìn)行處理
庫(kù)依賴:
1、Linux下的大多數(shù)函數(shù)都默認(rèn):
頭文件放到/usr/include/目錄下
而庫(kù)文件則放到/usr/lib/目錄下
2、GCC在編譯時(shí)必須有自己的辦法來(lái)查找所需要的頭文件和庫(kù)文件。
-I選項(xiàng)可以向GCC的頭文件搜索路徑中添加新的目錄。
例如,如果在/home/xiaowp/include/目錄下有編譯時(shí)所需要的頭文件,為了讓GCC能夠順利地找到它們,就可以使用-I選項(xiàng):
gcc -o test test.c -I /home/xiaowp/include
-L選項(xiàng)向GCC的庫(kù)文件搜索路徑中添加新的目錄
例如,如果在/home/xiaowp/lib/目錄下有鏈接時(shí)所需要的庫(kù)文件libfoo.so,為了讓GCC能夠順利地找到它,可以使用下面的命令
gcc -o test test.c -L /home/xiaowp/lib -lfoo
值得好好解釋一下的是-l選項(xiàng),它指示GCC去連接庫(kù)文件libfoo.so。
Linux下的庫(kù)文件在命名時(shí)有一個(gè)約定,那就是應(yīng)該以lib三個(gè)字母開(kāi)頭,由于所有的庫(kù)文件都遵循了同樣的規(guī)范,因此在用-l選項(xiàng)指定鏈接的庫(kù)文件名時(shí)可以省去lib三個(gè)字母,也就是說(shuō)GCC在對(duì)-lfoo進(jìn)行處理時(shí),會(huì)自動(dòng)去鏈接名為libfoo.so的文件。
-static選項(xiàng),強(qiáng)制使用靜態(tài)鏈接庫(kù)
如果在/home/xiaowp/lib/目錄下有鏈接時(shí)所需要的庫(kù)文件libfoo.so和libfoo.a
為了讓GCC在鏈接時(shí)只用到靜態(tài)鏈接庫(kù),可以使用下面的命令:
gcc -o test test.c -L /home/xiaowp/lib -static -lfoo
選項(xiàng)-O可以告訴GCC同時(shí)減小代碼的長(zhǎng)度和執(zhí)行時(shí)間,其效果等價(jià)于-O1。
在這一級(jí)別上能夠進(jìn)行的優(yōu)化類(lèi)型雖然取決于目標(biāo)處理器,但一般都會(huì)包括線程跳轉(zhuǎn)(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優(yōu)化。
選項(xiàng)-O2告訴GCC除了完成所有-O1級(jí)別的優(yōu)化之外,同時(shí)還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。
選項(xiàng)-O3則除了完成所有-O2級(jí)別的優(yōu)化之外,還包括循環(huán)展開(kāi)和其它一些與處理器特性相關(guān)的優(yōu)化工作。
通常來(lái)說(shuō),數(shù)字越大優(yōu)化的等級(jí)越高,同時(shí)也就意味著程序的運(yùn)行速度越快。
許多Linux程序員都喜歡使用-O2選項(xiàng),因?yàn)樗趦?yōu)化長(zhǎng)度、編譯時(shí)間和代碼大小之間,取得了一個(gè)比較理想的平衡點(diǎn)。
time ./test 查看程序執(zhí)行時(shí)間
優(yōu)化雖然能夠給程序帶來(lái)更好的執(zhí)行性能,但在如下一些場(chǎng)合中應(yīng)該避免優(yōu)化代碼:
程序開(kāi)發(fā)的時(shí)候優(yōu)化等級(jí)越高,消耗在編譯上的時(shí)間就越長(zhǎng),因此在開(kāi)發(fā)的時(shí)候最好不要使用優(yōu)化選項(xiàng),只有到軟件發(fā)行或開(kāi)發(fā)結(jié)束的時(shí)候,才考慮對(duì)最終生成的代碼進(jìn)行優(yōu)化。
資源受限的時(shí)候一些優(yōu)化選項(xiàng)會(huì)增加可執(zhí)行代碼的體積,如果程序在運(yùn)行時(shí)能夠申請(qǐng)到的內(nèi)存資源非常緊張(如一些實(shí)時(shí)嵌入式設(shè)備),那就不要對(duì)代碼進(jìn)行優(yōu)化,因?yàn)橛蛇@帶來(lái)的負(fù)面影響可能會(huì)產(chǎn)生非常嚴(yán)重的后果。
跟蹤調(diào)試的時(shí)候在對(duì)代碼進(jìn)行優(yōu)化的時(shí)候,某些代碼可能會(huì)被刪除或改寫(xiě),或者為了取得更佳的性能而進(jìn)行重組,從而使跟蹤和調(diào)試變得異常困難。
加速:
使用管道代替編譯中臨時(shí)文件,
-pipe 加速編譯
gcc -pipe foo.c -o foo
GCC常用選項(xiàng)
-c 通知GCC取消鏈接步驟,即編譯源碼并在最后生成目標(biāo)文件;
-Dmacro 定義指定的宏,使它能夠通過(guò)源碼中的#ifdef進(jìn)行檢驗(yàn);
-E 不經(jīng)過(guò)編譯預(yù)處理程序的輸出而輸送至標(biāo)準(zhǔn)輸出;
-g3 獲得有關(guān)調(diào)試程序的詳細(xì)信息,它不能與-o選項(xiàng)聯(lián)合使用;
-Idirectory 在包含文件搜索路徑的起點(diǎn)處添加指定目錄;
-llibrary 提示鏈接程序在創(chuàng)建最終可執(zhí)行文件時(shí)包含指定的庫(kù);
-O、-O2、-O3 將優(yōu)化狀態(tài)打開(kāi),該選項(xiàng)不能與-g選項(xiàng)聯(lián)合使用;
-S 要求編譯程序生成來(lái)自源代碼的匯編程序輸出;
-v 啟動(dòng)所有警報(bào);
-Wall 在發(fā)生警報(bào)時(shí)取消編譯操作,即將警報(bào)看作是錯(cuò)誤;
-Werror 在發(fā)生警報(bào)時(shí)取消編譯操作,即把報(bào)警當(dāng)作是錯(cuò)誤;
-w 禁止所有的報(bào)警