Ubuntu Linux gcc的常用命令
目錄
一、gcc簡(jiǎn)介
二、簡(jiǎn)單的gcc編譯
1 預(yù)處理
2 編譯為匯編語(yǔ)言代碼
3 匯編
4 連接
三、多個(gè)程序文件的編譯
四、檢查錯(cuò)誤
五、連接庫(kù)文件
1 編譯成可執(zhí)行文件
2 鏈接
3 強(qiáng)制鏈接時(shí)使用靜態(tài)鏈接庫(kù)
六、總結(jié)
一、gcc簡(jiǎn)介
Linux系統(tǒng)下的Gcc(GNU C Compiler)是GNU推出的功能強(qiáng)大、性能優(yōu)越的多平臺(tái)編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%。
二、簡(jiǎn)單的gcc編譯
建立一個(gè)test.c文件:
#include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; }輸入指令:
gcc test.c -o test?上述編譯過(guò)程是分為四個(gè)階段進(jìn)行的,即預(yù)處理(也稱預(yù)編譯,Preprocessing)、編譯(Compilation)、匯編 (Assembly)和連接(Linking)。
1 預(yù)處理
輸入命令:
gcc -E test.c -o test.i 或 gcc -E test.c該命令可以輸出 test.i 文件中存放著 test.c 經(jīng)預(yù)處理之后的代碼。
gcc 的-E 選項(xiàng),可以讓編譯器在預(yù)處理后停止,并輸出預(yù)處理結(jié)果。
在本例中,預(yù)處理結(jié)果就是將stdio.h 文件中的內(nèi)容插入到 test.c 中了。
2 編譯為匯編語(yǔ)言代碼
輸入命令:
gcc -S test.i -o test.s?gcc 的-S 選項(xiàng),表示在程序編譯期間,在生成匯編代碼后,停止,-o 輸出匯編代碼文件。
3 匯編
輸入命令:
gcc -c test.s -o test.o生成的匯編代碼文件 test.s,gas 匯編器負(fù)責(zé)將其編譯為目標(biāo)文件。?
4 連接
輸入命令:
gcc test.o -o test?gcc 連接器是 gas 提供的,負(fù)責(zé)將程序的目標(biāo)文件與所需的所有附加的目標(biāo)文件連接起來(lái),最終生成可執(zhí)行文件。附加的目標(biāo)文件包括靜態(tài)連接庫(kù)和動(dòng)態(tài)連接庫(kù)。
對(duì)于生成的 test.o,將其與C標(biāo)準(zhǔn)輸入輸出庫(kù)進(jìn)行連接,最終生成程序 test。
在命令行窗口中,執(zhí)行./test。
三、多個(gè)程序文件的編譯
通常整個(gè)程序是由多個(gè)源文件組成的,相應(yīng)地也就形成了多個(gè)編譯單元,使用 gcc能夠很好地管理這些編譯單元。假設(shè)有一個(gè)由 test1.c 和 test2.c 兩個(gè)源文件組成的程序,為了對(duì)它們進(jìn)行編譯,并最終生成可執(zhí)行程序 test,可以使用下面這條命令:
gcc test1.c test2.c -o test
如果同時(shí)處理的文件不止一個(gè),gcc 仍然會(huì)按照預(yù)處理、編譯和鏈接的過(guò)程依次進(jìn)行。如果深究起來(lái),上面這條命令大致相當(dāng)于依次執(zhí)行如下三條命令:
四、檢查錯(cuò)誤
輸入指令①:
gcc -pedantic illcode.c -o illcode-pedantic 編譯選項(xiàng)并不能保證被編譯程序與 ANSI/ISO C 標(biāo)準(zhǔn)的完全兼容,它僅僅只能用來(lái)幫助Linux 程序員離這個(gè)目標(biāo)越來(lái)越近。可以說(shuō),-pedantic 選項(xiàng)能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISO C 標(biāo)準(zhǔn)的代碼,但并不是全部,事實(shí)上只有 ANSI/ISO C 語(yǔ)言標(biāo)準(zhǔn)中要求進(jìn)行編譯器診斷的那些情況,才有可能被gcc發(fā)現(xiàn)并提出警告。除了-pedantic 之外,gcc 還有一些其它編譯選項(xiàng)也能夠產(chǎn)生有用的警告信息。這些選項(xiàng)大多以-W開頭,其中最有價(jià)值的當(dāng)數(shù)-Wall 了,使用它能夠使 gcc產(chǎn)生盡可能多的警告信息。
輸入指令②:
gcc -Wall illcode.c -o illcodegcc 給出的警告信息雖然從嚴(yán)格意義上說(shuō)不能算作錯(cuò)誤,但卻很可能成為錯(cuò)誤的棲身之所。應(yīng)該盡量避免產(chǎn)生警告信息。所以,在編譯程序時(shí)帶上-Werror 選項(xiàng),那么 gcc 會(huì)在所有產(chǎn)生警告的地方停止編譯,迫使程序員對(duì)自己的代碼進(jìn)行修改,如下
輸入指令③:
gcc -Werror test.c -o test?輸入錯(cuò)了一次指令,記住一定是大寫的W!另外因?yàn)槲募袥]有出現(xiàn)錯(cuò)誤,所以沒有檢查報(bào)告出錯(cuò)誤信息。
五、連接庫(kù)文件
開發(fā)軟件時(shí),通常來(lái)講都需要借助許多函數(shù)庫(kù)的支持才能夠完成相應(yīng)的功能。函數(shù)庫(kù)實(shí)際上就是一些頭文件(.h)和庫(kù)文件(so、或 lib、dll)的集合。?Linux 下的大多數(shù)函數(shù)都默認(rèn)將頭文件放到/usr/include/目錄下,而庫(kù)文件則放到/usr/lib/目錄下。
Windows 所使用的庫(kù)文件主要放在 Visual Stido 的目錄下的 include 和 lib,以及系統(tǒng)文件夾下。但有時(shí)候,要用的庫(kù)不再這些目錄下,所以 gcc 在編譯時(shí)必須用自己的辦法來(lái)查找所需要的頭文件和庫(kù)文件。例如 test.c 是在 linux 上使用 c 連接 mysql,這個(gè)時(shí)候我們需要去 mysql 官網(wǎng)下載 MySQLConnectors 的 C 庫(kù),下載下來(lái)解壓之后,有一個(gè) include 文件夾,里面包含 mysql connectors 的頭文件,還有一個(gè) lib 文件夾,里面包含二進(jìn)制 so 文件 libmysqlclient.so。
其中 inclulde 文件夾的路經(jīng)是/usr/dev/mysql/include,lib 文件夾是/usr/dev/mysql/lib。
1 編譯成可執(zhí)行文件
gcc –c –I /usr/dev/mysql/include test.c –o test.o?
2 鏈接
gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test?Linux 下的庫(kù)文件分為兩大類分別是動(dòng)態(tài)鏈接庫(kù)和靜態(tài)鏈接庫(kù)。
3 強(qiáng)制鏈接時(shí)使用靜態(tài)鏈接庫(kù)
在/usr/dev/mysql/lib 目錄下有鏈接時(shí)所需要的庫(kù)文件 libmysqlclient.so 和 libmysqlclient.a,為了讓
gcc 在鏈接時(shí)只用到靜態(tài)鏈接庫(kù),可以使用下面的命令:
如果需要的話可以在編譯時(shí)加上-static 選項(xiàng),強(qiáng)制使用靜態(tài)鏈接庫(kù)。
六、總結(jié)
通過(guò)老師給的資料和同學(xué)的幫助熟悉了gcc編譯的原理和過(guò)程,另外熟悉了很多指令的運(yùn)用,會(huì)加快輸入指令的速度。
總結(jié)
以上是生活随笔為你收集整理的Ubuntu Linux gcc的常用命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab小波变换特侦提取,如何利用小
- 下一篇: Linux signal 信号列表(