日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Ubuntu Linux gcc的常用命令

發(fā)布時(shí)間:2024/3/24 linux 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ubuntu Linux gcc的常用命令 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、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í)行如下三條命令:

gcc -c test1.c -o test1.o gcc -c test2.c -o test2.o gcc test1.o test2.o -o test

四、檢查錯(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 illcode

gcc 給出的警告信息雖然從嚴(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ù),可以使用下面的命令:

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

如果需要的話可以在編譯時(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。