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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux GCC常用命令

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

目錄

一、示例一

1.簡單編譯

1.1預(yù)處理

1.2編譯為匯編代碼

1.3匯編

1.4連接

?2.多個程序文件的編譯

3檢錯

4庫文件連接

?二、示例二

1.準(zhǔn)備hello.c

?2.預(yù)處理

3.編譯

4.匯編

5.鏈接

6.分析ELF文件

6.1ELF文件的段

6.2反匯編ELF


一、示例一

1.簡單編譯

創(chuàng)建文件mkdir test4

cd? test4

gedit test.c

test.c內(nèi)容如下:

?

?這個程序一步到位的·指令是gcc test.c -o test。這一過程是分為四個階段進(jìn)行的,即預(yù)處理(也稱預(yù)編譯)、編譯、匯編和連接。

1.1預(yù)處理

gcc -E test.c -o test.i 或者gcc -E test.c

gcc 的-E選項 可以讓編譯器在預(yù)處理后停止,并輸出與處理結(jié)果。在本例中,預(yù)處理結(jié)果就是將stdio.h文件中的內(nèi)容插入到test.c中

1.2編譯為匯編代碼

gcc -S test.i -o test.s

gcc的-S選項表示程序編譯期間,在生成匯編代碼之后停止,-o輸出匯編代碼文件。

1.3匯編

gcc -c test.s -o test.o

對于上一小節(jié)生成的匯編代碼文件test.s,gas匯編器負(fù)責(zé)將其編譯為目標(biāo)文件

1.4連接

gcc test.o -o test

?

對于上一小節(jié)中生成的test.o,將其與C標(biāo)準(zhǔn)輸入輸出庫進(jìn)行連接,最終生成程序test,然后執(zhí)行

?2.多個程序文件的編譯

該處內(nèi)容有在上上一篇博客中編寫,有需要可前往。

3檢錯

gcc -pedantic test.c -o test

-pedantic選項能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISO C標(biāo)準(zhǔn)的代碼,但不是全部,事實上只有ANSI/ISO C語言標(biāo)準(zhǔn)中要求進(jìn)行編譯器診斷的情況才有可能被GCC發(fā)現(xiàn)并警告。

gcc -Wall test.c -o test

-Wall能夠使GCC產(chǎn)生更多的警告信息

gcc -Werror test.c -o test

-Werror選項會使GCC在所有產(chǎn)生警告的地方停止編譯,迫使程序員對代碼進(jìn)行修改。

4庫文件連接

函數(shù)庫實際上就是一些頭文件(.h)和庫文件(so、lib、dll)的集合,Linux下的大多數(shù)函數(shù)都默認(rèn)頭文件放到/usr/include目錄下,而庫文件則放到/usr/lib目錄下,但有時候需要用到的庫不在這些目錄下,所以GCC在編譯時必須用自己的辦法來查找所需的頭文件和庫文件。

test.c是在Linux上使用c連接mysql,需要去官網(wǎng)下載MySQL Connectors的C庫,里面有一個include文件夾,包含mysql connectors的頭文件,還有一個lib文件夾,里面包含二進(jìn)制so文件libmysqlclient.so

include文件夾路徑為/usr/dev/mysql/include.lib? ??

lib文件夾是/usr/dev/mysql/lib

編譯成可執(zhí)行文件

gcc -c -I /usr/dev/mysql/include test.c -o test.o

鏈接

把所有目標(biāo)文件鏈接成可執(zhí)行文件

gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test

?

強(qiáng)制鏈接時使用靜態(tài)庫

默認(rèn)情況下,GCC在鏈接時會優(yōu)先使用動態(tài)庫。為了讓GCC在鏈接時只用到靜態(tài)庫可使用以下命令

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

?二、示例二

1.準(zhǔn)備hello.c

?2.預(yù)處理

gcc -E hello.c -o hello.i

3.編譯

gcc -S hello.i -o hello.s

?

4.匯編

gcc -c hello.s -o hello.o或者as -c hello.s -o hello.o

?

5.鏈接

若使用命令gcc hello.c -o hello則會使用動態(tài)庫進(jìn)行鏈接,生成的ELF可執(zhí)行文件大小和鏈接的動態(tài)庫如下所示

?若使用命令gcc -static hello.c -o hello則會使用靜態(tài)庫進(jìn)行鏈接,生成的ELF可執(zhí)行文件大小和鏈接的動態(tài)庫如下所示

6.分析ELF文件

6.1ELF文件的段

readelf -S hello

6.2反匯編ELF

objdump -D hello

使用objdump -S將其反匯編并且將其C語言源代碼混合顯示出來

gcc -o hello -g hello.c

objdump -S hello

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Linux GCC常用命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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