CFLAGS详解
CFLAGS 表示用于 C 編譯器的選項(xiàng),
CXXFLAGS 表示用于 C++ 編譯器的選項(xiàng)。
這兩個(gè)變量實(shí)際上涵蓋了編譯和匯編兩個(gè)步驟。
CFLAGS: 指定頭文件(.h文件)的路徑,如:CFLAGS=-I/usr/include -I/path/include。同樣地,安裝一個(gè)包時(shí)會(huì)在安裝路徑下建立一個(gè)include目錄,當(dāng)安裝過(guò)程中出現(xiàn)問(wèn)題時(shí),試著把以前安裝的包的include目錄加入到該變量中來(lái)。
LDFLAGS:gcc 等編譯器會(huì)用到的一些優(yōu)化參數(shù),也可以在里面指定庫(kù)文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安裝一個(gè)包都幾乎一定的會(huì)在安裝目錄里建立一個(gè)lib目錄。如果明明安裝了某個(gè)包,而安裝另一個(gè)包時(shí),它愣是說(shuō)找不到,可以抒那個(gè)包的lib路徑加入的LDFALGS中試一下。
LIBS:告訴鏈接器要鏈接哪些庫(kù)文件,如LIBS = -lpthread -liconv
簡(jiǎn)單地說(shuō),LDFLAGS是告訴鏈接器從哪里尋找?guī)煳募?#xff0c;而LIBS是告訴鏈接器要鏈接哪些庫(kù)文件。不過(guò)使用時(shí)鏈接階段這兩個(gè)參數(shù)都會(huì)加上,所以你即使將這兩個(gè)的值互換,也沒(méi)有問(wèn)題。
有時(shí)候LDFLAGS指定-L雖然能讓鏈接器找到庫(kù)進(jìn)行鏈接,但是運(yùn)行時(shí)鏈接器卻找不到這個(gè)庫(kù),如果要讓軟件運(yùn)行時(shí)庫(kù)文件的路徑也得到擴(kuò)展,那么我們需要增加這兩個(gè)庫(kù)給"-Wl,R":
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如果在執(zhí)行./configure以前設(shè)置環(huán)境變量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意設(shè)置環(huán)境變量等號(hào)兩邊不可以有空格,而且要加上引號(hào)(shell的用法)。那么執(zhí)行configure以后,Makefile將會(huì)設(shè)置這個(gè)選項(xiàng),鏈接時(shí)會(huì)有這個(gè)參數(shù),編譯出來(lái)的可執(zhí)行程序的庫(kù)文件搜索路徑就得到擴(kuò)展了。
?gcc編譯器 CFLAGS 標(biāo)志參數(shù)說(shuō)明
CFLAGS = -g -O2? -Wall -Werror -Wno-unused 編譯出現(xiàn)警告性錯(cuò)誤unused-but-set-variable,變量定義但沒(méi)有使用,解決方法:
?增加CFLAGS 或CPPFLAGS參數(shù)如下:
? CPPFLAGS=" -Werror -Wno-unused-but-set-variable" || exit 1
????????????????????????????????????????? Gcc總體選項(xiàng)列表
| 后 綴 名 | 所對(duì)應(yīng)的語(yǔ)言 |
| -S | 只是編譯不匯編,生成匯編代碼 |
| -E | 只進(jìn)行預(yù)編譯,不做其他處理 |
| -g | 在可執(zhí)行程序中包含標(biāo)準(zhǔn)調(diào)試信息 |
| -o file | 把輸出文件輸出到file里 |
| -v | 打印出編譯器內(nèi)部編譯各過(guò)程的命令行信息和編譯器的版本 |
| -I dir | 在頭文件的搜索路徑列表中添加dir目錄 |
| -L dir | 在庫(kù)文件的搜索路徑列表中添加dir目錄 |
| -static | 鏈接靜態(tài)庫(kù) |
| -llibrary | 連接名為library的庫(kù)文件 |
| ? | ? |
?
· “-I dir”
正如上表中所述,“-I dir”選項(xiàng)可以在頭文件的搜索路徑列表中添加dir目錄。由于Linux中頭文件都默認(rèn)放到了“/usr/include/”目錄下,因此,當(dāng)用戶希望添加放置在其他位置的頭文件時(shí),就可以通過(guò)“-I dir”選項(xiàng)來(lái)指定,這樣,Gcc就會(huì)到相應(yīng)的位置查找對(duì)應(yīng)的目錄。
比如在“/root/workplace/Gcc”下有兩個(gè)文件:
#include
int main()
{
???? printf(“Hello!!\n”);
???? return 0;
}
#include
這樣,就可在Gcc命令行中加入“-I”選項(xiàng):
[root@localhost Gcc] Gcc?hello1.c –I /root/workplace/Gcc/ -o hello1
這樣,Gcc就能夠執(zhí)行出正確結(jié)果。
小知識(shí)
在include語(yǔ)句中,“<>”表示在標(biāo)準(zhǔn)路徑中搜索頭文件,““””表示在本目錄中搜索。故在上例中,可把hello1.c的“#include”改為“#include “my.h””,就不需要加上“-I”選項(xiàng)了。
· “-L dir”
選項(xiàng)“-L dir”的功能與“-I dir”類似,能夠在庫(kù)文件的搜索路徑列表中添加dir目錄。例如有程序hello_sq.c需要用到目錄“/root/workplace/Gcc/lib”下的一個(gè)動(dòng)態(tài)庫(kù)libsunq.so,則只需鍵入如下命令即可:
[root@localhost Gcc]?Gcc hello_sq.c –L /root/workplace/Gcc/lib –lsunq –o hello_sq
需要注意的是,“-I dir”和“-L dir”都只是指定了路徑,而沒(méi)有指定文件,因此不能在路徑中包含文件名。
另外值得詳細(xì)解釋一下的是“-l”選項(xiàng),它指示Gcc去連接庫(kù)文件libsunq.so。由于在Linux下的庫(kù)文件命名時(shí)有一個(gè)規(guī)定:必須以lib三個(gè)字母開(kāi)頭。因此在用-l選項(xiàng)指定鏈接的庫(kù)文件名時(shí)可以省去lib三個(gè)字母。也就是說(shuō)Gcc在對(duì)”-lsunq”進(jìn)行處理時(shí),會(huì)自動(dòng)去鏈接名為libsunq.so的文件。
(2)告警和出錯(cuò)選項(xiàng)
Gcc的告警和出錯(cuò)選項(xiàng)如表3.8所示。
??????????????????????????????????????????????????????? Gcc總體選項(xiàng)列表
| 選 項(xiàng) | 含 義 |
| -ansi | 支持符合ANSI標(biāo)準(zhǔn)的C程序 |
| -pedantic | 允許發(fā)出ANSI C標(biāo)準(zhǔn)所列的全部警告信息 |
| -pedantic-error | 允許發(fā)出ANSI C標(biāo)準(zhǔn)所列的全部錯(cuò)誤信息 |
| -w | 關(guān)閉所有告警 |
| -Wall | 允許發(fā)出Gcc提供的所有有用的報(bào)警信息 |
| -werror | 把所有的告警信息轉(zhuǎn)化為錯(cuò)誤信息,并在告警發(fā)生時(shí)終止編譯過(guò)程 |
?
下面結(jié)合實(shí)例對(duì)這幾個(gè)告警和出錯(cuò)選項(xiàng)進(jìn)行簡(jiǎn)單的講解。
如有以下程序段:
#include
void main()
{
???? long long tmp = 1;
???? printf(“This is a bad code!\n”);
???? return 0;
}
這是一個(gè)很糟糕的程序,讀者可以考慮一下有哪些問(wèn)題?
· “-ansi”
該選項(xiàng)強(qiáng)制Gcc生成標(biāo)準(zhǔn)語(yǔ)法所要求的告警信息,盡管這還并不能保證所有沒(méi)有警告的程序都是符合ANSI C標(biāo)準(zhǔn)的。運(yùn)行結(jié)果如下所示:
[root@localhost Gcc]# Gcc?–ansi warning.c –o warning
warning.c: 在函數(shù)“main”中:
warning.c:7 警告:在無(wú)返回值的函數(shù)中,“return”帶返回值
warning.c:4 警告:“main”的返回類型不是“int”
可以看出,該選項(xiàng)并沒(méi)有發(fā)現(xiàn)”long long”這個(gè)無(wú)效數(shù)據(jù)類型的錯(cuò)誤。
· “-pedantic”
允許發(fā)出ANSI C標(biāo)準(zhǔn)所列的全部警告信息,同樣也保證所有沒(méi)有警告的程序都是符合ANSI C標(biāo)準(zhǔn)的。其運(yùn)行結(jié)果如下所示:
[root@localhost Gcc]# Gcc –pedantic warning.c –o warning
warning.c: 在函數(shù)“main”中:
warning.c:5 警告:ISO C90不支持“l(fā)ong long”
warning.c:7 警告:在無(wú)返回值的函數(shù)中,“return”帶返回值
warning.c:4 警告:“main”的返回類型不是“int”
可以看出,使用該選項(xiàng)查看出了”long long”這個(gè)無(wú)效數(shù)據(jù)類型的錯(cuò)誤。
· “-Wall”
允許發(fā)出Gcc能夠提供的所有有用的報(bào)警信息。該選項(xiàng)的運(yùn)行結(jié)果如下所示:
[root@localhost Gcc]# Gcc?–Wall warning.c –o warning
warning.c:4 警告:“main”的返回類型不是“int”
warning.c: 在函數(shù)”main”中:
warning.c:7 警告:在無(wú)返回值的函數(shù)中,”return”帶返回值
warning.c:5 警告:未使用的變量“tmp”
使用“-Wall”選項(xiàng)找出了未使用的變量tmp,但它并沒(méi)有找出無(wú)效數(shù)據(jù)類型的錯(cuò)誤。
另外,Gcc還可以利用選項(xiàng)對(duì)單獨(dú)的常見(jiàn)錯(cuò)誤分別指定警告,有關(guān)具體選項(xiàng)的含義感興趣的讀者可以查看Gcc手冊(cè)進(jìn)行學(xué)習(xí)。
(3)優(yōu)化選項(xiàng)
Gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過(guò)編譯選項(xiàng)“-On”來(lái)控制優(yōu)化代碼的生成,其中n是一個(gè)代表優(yōu)化級(jí)別的整數(shù)。對(duì)于不同版本的Gcc來(lái)講,n的取值范圍及其對(duì)應(yīng)的優(yōu)化效果可能并不完全相同,比較典型的范圍是從0變化到2或3。
不同的優(yōu)化級(jí)別對(duì)應(yīng)不同的優(yōu)化處理工作。如使用優(yōu)化選項(xiàng)“-O”主要進(jìn)行線程跳轉(zhuǎn)(Thread Jump)和延遲退棧(Deferred Stack Pops)兩種優(yōu)化。使用優(yōu)化選項(xiàng)“-O2”除了完成所有“-O1”級(jí)別的優(yōu)化之外,同時(shí)還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項(xiàng)“-O3”則還包括循環(huán)展開(kāi)和其他一些與處理器特性相關(guān)的優(yōu)化工作。
雖然優(yōu)化選項(xiàng)可以加速代碼的運(yùn)行速度,但對(duì)于調(diào)試而言將是一個(gè)很大的挑戰(zhàn)。因?yàn)榇a在經(jīng)過(guò)優(yōu)化之后,原先在源程序中聲明和使用的變量很可能不再使用,控制流也可能會(huì)突然跳轉(zhuǎn)到意外的地方,循環(huán)語(yǔ)句也有可能因?yàn)檠h(huán)展開(kāi)而變得到處都有,所有這些對(duì)調(diào)試來(lái)講都將是一場(chǎng)噩夢(mèng)。所以筆者建議在調(diào)試的時(shí)候最好不使用任何優(yōu)化選項(xiàng),只有當(dāng)程序在最終發(fā)行的時(shí)候才考慮對(duì)其進(jìn)行優(yōu)化。
(4)體系結(jié)構(gòu)相關(guān)選項(xiàng)
Gcc的體系結(jié)構(gòu)相關(guān)選項(xiàng)如表3.9所示。
??????????????????????????????????????????????????? Gcc體系結(jié)構(gòu)相關(guān)選項(xiàng)列表
| 選 項(xiàng) | 含 義 |
| -mcpu=type | 針對(duì)不同的CPU使用相應(yīng)的CPU指令。可選擇的type有i386、i486、pentium及i686等 |
| -mieee-fp | 使用IEEE標(biāo)準(zhǔn)進(jìn)行浮點(diǎn)數(shù)的比較 |
| -mno-ieee-fp | 不使用IEEE標(biāo)準(zhǔn)進(jìn)行浮點(diǎn)數(shù)的比較 |
| -msoft-float | 輸出包含浮點(diǎn)庫(kù)調(diào)用的目標(biāo)代碼 |
| -mshort | 把int類型作為16位處理,相當(dāng)于short int |
| -mrtd | 強(qiáng)行將函數(shù)參數(shù)個(gè)數(shù)固定的函數(shù)用ret NUM返回,節(jié)省調(diào)用函數(shù)的一條指令 |
總結(jié)
- 上一篇: 创建链表
- 下一篇: Mac安装homebrew,postma