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