??樊梓慕:個人主頁
???個人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)》《藍橋杯試題》《LeetCode刷題筆記》《實訓(xùn)項目》《C++》《Linux》
??每一個不曾起舞的日子,都是對生命的辜負
目錄
前言
1.gcc/g++語法
2.gcc的使用及編譯器是如何"翻譯"代碼的?
(1)預(yù)處理
(2)編譯
(3)匯編
(4)鏈接
3.動靜態(tài)庫
4.gdb的使用
前言
本篇文章博主將會講解gcc/g++的使用并搭配編譯器相關(guān)知識講解代碼翻譯的過程,一些常見的gcc/g++語法也會總結(jié)出來,在Linux下想要調(diào)試代碼我們需要借助GUN調(diào)試器(gdb),那如何使用gdb博主也會進行講解。
歡迎大家??收藏??以便未來做題時可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================文章來源地址http://www.zghlxwxcb.cn/news/detail-756312.html
GITEE相關(guān)代碼:??fanfei_c的倉庫??
=========================================================================
1.gcc/g++語法
gcc [選項] 要編譯的文件 [選項] [目標(biāo)文件]
??常用選項速覽??
- -E 只激活預(yù)處理,這個不生成文件,你需要把它重定向到一個輸出文件里面(否則就會打印到屏幕上)。
- -S 編譯到匯編語言不進行匯編和鏈接。
- -c 編譯到目標(biāo)代碼。
- -o 將處理結(jié)果輸出到指定文件,后接文件名。
- -static 此選項對生成的文件采用靜態(tài)鏈接。
- -g 生成調(diào)試信息。GNU 調(diào)試器(即gdb調(diào)試器)可利用該信息。
- -shared 此選項將盡量使用動態(tài)庫,所以生成文件比較小。
- -w 不生成任何警告信息。
- -Wall 生成所有警告信息。
- -O0/-O1/-O2/-O3 編譯器的優(yōu)化選項的4個級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高
2.gcc的使用及編譯器是如何"翻譯"代碼的?
(1)預(yù)處理
預(yù)處理功能主要包括宏替換、頭文件展開、條件編譯、去注釋等,預(yù)處理指令是以#號開頭的代碼行。
實例: gcc –E test.c –o test.i
選項“-E”,該選項的作用是讓 gcc 在預(yù)處理結(jié)束后停止編譯過程。
選項“-o”是指目標(biāo)文件,“.i”文件為已經(jīng)過預(yù)處理的C原始程序
條件編譯多提一嘴:
我們可以通過給編譯器傳遞不同的宏值,來進行對代碼的動態(tài)裁剪。
實例:gcc test.c -o test -D VERSION1=1
(2)編譯
編譯階段,gcc/g++首先檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,將代碼翻譯成匯編語言。
實例:gcc -S test.i -o test.s
用戶可以使用-S選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼。
-o選項是指目標(biāo)文件,“xxx.s”文件為已經(jīng)過翻譯的原始程序。
(3)匯編
匯編階段是把編譯階段生成的“xxx.s”文件轉(zhuǎn)成目標(biāo)文件。
實例:gcc –c test.s –o test.o
-c選項可以得到匯編代碼轉(zhuǎn)化為“xxx.o”的二進制目標(biāo)代碼了。
(4)鏈接
在成功完成以上步驟之后,就進入了鏈接階段。
鏈接的主要任務(wù)就是將生成的各個“xxx.o”文件進行鏈接,生成可執(zhí)行文件。
gcc/g++不帶-E、-S、-c選項時,就默認生成預(yù)處理、編譯、匯編、鏈接全過程后的文件。
實例:gcc test.o –o test
巧記:鍵盤左上角ESC分別對應(yīng)預(yù)處理、編譯、匯編。
若不用-o選項指定生成文件的文件名,則默認生成的可執(zhí)行文件名為a.out。
在我們編寫代碼時時常需要使用庫函數(shù)中的函數(shù),比如stdio.h中的printf函數(shù),但當(dāng)我們展開stdio.h文件后發(fā)現(xiàn)也只是有printf的函數(shù)聲明,那么這些庫函數(shù)的定義放在哪里了呢?
就以stdio.h頭文件舉例,里面的庫函數(shù)實現(xiàn)在了名為libc.so.6(C標(biāo)準(zhǔn)庫)的庫文件中。在沒有特別指定時,gcc 會到系統(tǒng)默認的搜索路徑“/usr/lib”下進行查找,也就是鏈接到 libc.so.6 庫函數(shù)中去,這樣就能實現(xiàn)printf函數(shù)了,而這也就是鏈接的作用。
3.動靜態(tài)庫
- 靜態(tài)庫是指編譯鏈接時,把庫文件的代碼全部加入到可執(zhí)行文件當(dāng)中,因此生成的文件比較大,但在運行時也就不再需要庫文件了,靜態(tài)庫一般以.a為后綴。
- 動態(tài)庫與之相反,在編譯鏈接時并沒有把庫文件的代碼加入到可執(zhí)行文件當(dāng)中,而是在程序運行時由鏈接文件加載庫,這樣可以節(jié)省系統(tǒng)的開銷,動態(tài)庫一般以.so為后綴。
動靜態(tài)庫的優(yōu)缺點對比:
鏈接方式 | 庫及特性 | Linux(后綴) | Windows(后綴) |
動態(tài)鏈接 | 動態(tài)庫(被多個使用者共同使用,一旦缺失,所有程序都不可以運行了) | .so | .dll |
靜態(tài)鏈接 | 靜態(tài)庫(不需要關(guān)聯(lián),將庫文件代碼直接拷貝到可執(zhí)行文件中) | .a | .lib |
動態(tài)庫
- 優(yōu)點:節(jié)省資源(包括磁盤、內(nèi)存、網(wǎng)絡(luò)等資源),不會出現(xiàn)太多重復(fù)代碼。
- 缺點:對庫的依賴性較強,一旦庫丟失,所有使用這個庫的程序都無法運行。
靜態(tài)庫
- 優(yōu)點:不依賴庫,同類型平臺中都可以直接運行。
- 缺點:可執(zhí)行程序體積較大,比較浪費自愿。
動態(tài)鏈接實例:gcc -o mybin mytest.c(Linux默認)
靜態(tài)鏈接實例:gcc -o mybin-static mytest.c -static
可利用file查看可執(zhí)行文件的鏈接方式:
?比對下靜態(tài)鏈接與動態(tài)鏈接生成的可執(zhí)行文件的大小:
所以說靜態(tài)鏈接安全可靠,但是浪費資源。?
可利用ldd 文件名查看可執(zhí)行文件所依賴的庫(當(dāng)有缺失時會有提示):
4.gdb的使用
首先我們知道程序的發(fā)布方式有兩種:
- debug版本:程序本身會被加入更多的調(diào)試信息,以便于進行調(diào)試。
- release版本:不會添加任何調(diào)試信息,是不可調(diào)試的。
在Linux當(dāng)中g(shù)cc/g++默認生成的可執(zhí)行程序是release版本的,是不可被調(diào)試的。
如果想生成debug版本,就需要在使用gcc/g++生成可執(zhí)行程序時加上-g選項。
???gdb語法速覽??
【安裝gdb】
- sudo yum install -y gdb?
【進入gdb】
- 指令: gdb?文件名
【調(diào)試】
- 「run/r」:運行代碼(啟動調(diào)試)。
- 「next/n」:逐過程調(diào)試。
- 「step/s」:逐語句調(diào)試。
- 「until?行號」:跳轉(zhuǎn)至指定行。
- 「finish」:執(zhí)行完當(dāng)前正在調(diào)用的函數(shù)后停下來(不能是主函數(shù))。
- 「continue/c」:運行到下一個斷點處。
- 「set?var?變量=x」:修改變量的值為x。
【顯示】
- 「list/l?n」:顯示從第n行開始的源代碼,每次顯示10行,若n未給出則默認從上次的位置往下顯示.。
- 「list/l?函數(shù)名」:顯示該函數(shù)的源代碼。
- 「print/p?變量」:打印變量的值。
- 「print/p?&變量」:打印變量的地址。
- 「print/p?表達式」:打印表達式的值,通過表達式可以修改變量的值。
- 「display?變量」:將變量加入常顯示(每次停下來都顯示它的值)。
- 「display?&變量」:將變量的地址加入常顯示。
- 「undisplay?編號」:取消指定編號變量的常顯示。
- 「bt」:查看各級函數(shù)調(diào)用及參數(shù)。
- 「info/i?locals」:查看當(dāng)前棧幀當(dāng)中局部變量的值。
【斷點】
- 「break/b?n」:在第n行設(shè)置斷點。(多文件"在test.c文件的第7行"打斷點:b test.c:7)
- 「break/b?函數(shù)名」:在某函數(shù)體內(nèi)第一行設(shè)置斷點。
- 「info?breakpoint/b」:查看已打斷點信息。
- 「delete/d?編號」:刪除指定編號的斷點。
- 「disable?編號」:禁用指定編號的斷點。
- 「enable?編號」:啟用指定編號的斷點。
【退出gdb】
- 「quit/q」:退出gdb。
=========================================================================
如果你對該系列文章有興趣的話,歡迎持續(xù)關(guān)注博主動態(tài),博主會持續(xù)輸出優(yōu)質(zhì)內(nèi)容
??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動力??
??~ 點贊收藏+關(guān)注 ~??文章來源:http://www.zghlxwxcb.cn/news/detail-756312.html
=========================================================================
到了這里,關(guān)于【Linux】編譯器-gcc/g++與調(diào)試器-gdb的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!