![Linux嵌入式開發(fā)學(xué)習(xí)指南之GCC工具_(dá)第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/2/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c1.gif)
![Linux嵌入式開發(fā)學(xué)習(xí)指南之GCC工具_(dá)第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/2/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c2.gif)
![Linux嵌入式開發(fā)學(xué)習(xí)指南之GCC工具_(dá)第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/2/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c3.gif)
![Linux嵌入式開發(fā)學(xué)習(xí)指南之GCC工具_(dá)第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/2/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c4.gif)
![Linux嵌入式開發(fā)學(xué)習(xí)指南之GCC工具_(dá)第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/2/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c/5d26797d-6ab0-4a18-9e47-7f3a4a110b8c5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、【目錄】1、GCC介2、GCC的執(zhí)行過(guò)程3、GCC的基本用法和選項(xiàng)4、GCC的錯(cuò)誤類型及對(duì)策5、幾個(gè)相關(guān)的環(huán)境變量1、GC漪介L(zhǎng)inux系統(tǒng)下的GCC(GNU C Compiler是GNU推出的功能強(qiáng)大、性能優(yōu)越 的多平臺(tái)編譯器,是 GNU 的代表作品之一。GCC是可以在多種硬體平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效 率與一般的編譯器相比平均效率要高20%30%。GC魏譯器能將C、C+畸言源程序、匯程式化序和目標(biāo)程序編譯、連接成可執(zhí)行文件,如 果沒(méi)有給出可執(zhí)行文件的名字,GCCa生成一個(gè)名為a.out的文件。在Linux系 統(tǒng)中,可執(zhí)行文件沒(méi)有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來(lái)區(qū)分可執(zhí)行文件
2、和不 可執(zhí)行文件。而GCC則通過(guò)后綴來(lái)區(qū)別輸入文件白類別,下面我們來(lái)介紹GCC所遵循的部分約定規(guī)則。.c為后綴的文件,C語(yǔ)言源代碼文件;.a為后綴的文件,是由目標(biāo)文件構(gòu)成的檔案庫(kù)文件;.C, .cc或.cxx為后綴的文件,是C+堿代碼文件;.h 為后綴的文件,是程序所包含的頭文件;.i為后綴的文件,是已經(jīng)預(yù)處理過(guò)的 C源代碼文件;.ii為后綴的文件,是已經(jīng)預(yù)處理過(guò)的 C+礴代碼文件;.m為后綴的文件,是Objective-C源代碼文件;.o 為后綴的文件,是編譯后的目標(biāo)文件;.s 為后綴的文件,是匯編語(yǔ)言源代碼文件;.S為后綴的文件,是經(jīng)過(guò)預(yù)編譯的匯編語(yǔ)言源代碼文件。2、GCC的執(zhí)行過(guò)程雖然我
3、們稱GCC是C語(yǔ)言的編譯器,但使用 GCC由C語(yǔ)言源代碼文件生成 可執(zhí)行文件的過(guò)程不僅僅是編譯的過(guò)程,而是要經(jīng)歷四個(gè)相互關(guān)聯(lián)的步驟:預(yù)處理(也稱預(yù)編譯,Preprocessing)編譯(Compilation)、匯編(Assembly和連接 (Linking)。命令GCC首先調(diào)用cpp進(jìn)行預(yù)處理,在預(yù)處理過(guò)程中,對(duì)源代碼文件中的 文件包含(include)、預(yù)編譯語(yǔ)句(如宏定義define等)進(jìn)行分析。接著調(diào)用cc1進(jìn) 行編譯,這個(gè)階段根據(jù)輸入文件生成以 .o 為后綴的目標(biāo)文件。匯編過(guò)程是針對(duì)匯編語(yǔ)言的步驟,調(diào)用as進(jìn)行工作,一般來(lái)講,.S為后綴的匯編語(yǔ)言源代碼文 件和匯編、 .s 為后綴的匯
4、編語(yǔ)言文件經(jīng)過(guò)預(yù)編譯和匯編之后都生成以 .o 為后綴 的目標(biāo)文件。當(dāng)所有的目標(biāo)文件都生成之后,GCCM調(diào)用ld來(lái)完成最后的關(guān)鍵性工作,這個(gè)階段就是連接。在連接階段,所有的目標(biāo)文件被安排在可執(zhí)行程 序中的恰當(dāng)?shù)奈恢茫瑫r(shí),該程序所調(diào)用到的庫(kù)函數(shù)也從各自所在的檔案庫(kù)中 連到合適的地方。3、GCC的基本用法和選項(xiàng)在使用GCC扁譯器的時(shí)候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名 稱。GC魏譯器的調(diào)用參數(shù)大約有100多個(gè),其中多數(shù)參數(shù)我們可能根本就用 不到,這里只介紹其中最基本、最常用的參數(shù)。GCC最基本的用法是:GCC options filenames其中 options 就是編譯器所需要的參數(shù),
5、 filenames 給出相關(guān)的文件名稱。- c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。- o output_filename ,確定輸出文件的名稱為 output_filename ,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),GCCM給出預(yù)設(shè)的可執(zhí)行文件a.out。- g,產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行 調(diào)試,我們就必須加入這個(gè)選項(xiàng)。- E只運(yùn)行C預(yù)編譯器。- O,對(duì)程序進(jìn)行優(yōu)化編譯、連接,采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、 連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生
6、的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應(yīng)地要慢一些。- O2,比-O更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。- Idirname ,將 dirname 所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#includeB)#include “ myinc.h ”其中,A類使用尖括號(hào)( ),B類使用雙引號(hào)(“。”對(duì)于A類,預(yù)處理程序 cpp在系統(tǒng)預(yù)設(shè)包含文件目錄(如/usr/include)中搜尋相應(yīng)的文件,而對(duì)于 B類, cpp在當(dāng)前目錄中搜尋頭文件,這個(gè)選項(xiàng)的作用是告訴 cpp,如果在當(dāng)前目錄中 沒(méi)有找到需要
7、的文件,就到指定的 dirname 目錄中去尋找。在程序設(shè)計(jì)中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個(gè)使用 -I 選項(xiàng) 給出搜索路徑。- 1 和-L- l 參數(shù)就是用來(lái)指定程序要鏈接的庫(kù), -l 參數(shù)緊接著就是庫(kù)名,那么庫(kù)名跟真正的庫(kù)文件名有什么關(guān)系呢?就拿數(shù)學(xué)庫(kù)來(lái)說(shuō),他的庫(kù)名是m ,他的庫(kù)文件名是libm.so,很容易看出,把庫(kù)文件名的頭lib和尾.so去掉就是庫(kù)名了好了現(xiàn) 在我們知道怎么得到庫(kù)名,當(dāng)我們自已要用到一個(gè)第三方提供的庫(kù)名字libtest.so ,那么我們只要把libtest.so 拷貝到 /usr/lib 里,編譯時(shí)加上 -ltest 參數(shù),我們就能用上l
8、ibtest.so 庫(kù)了(當(dāng)然要用 libtest.so 庫(kù)里的函數(shù),我們還需要與libtest.so配套的頭文件)放在/lib和/usr/lib和/usr/local/lib里的庫(kù)直接用-1參數(shù)就能鏈接了,但如果 庫(kù)文件沒(méi)放在這三個(gè)目錄里,而是放在其他目錄里,這時(shí)我們只用 -l 參數(shù)的話, 鏈接還是會(huì)出錯(cuò),出錯(cuò)信息大概是:“ /usr/bin/ld:cannot find-lxxx :也就是鏈接程序1d在那3個(gè)目錄里找不到libxxx.so,這 時(shí)另外一個(gè)參數(shù)-L就派上用場(chǎng)了,比如常用的 X11的庫(kù),它在/usr/X11R6/1ib目 錄下,我們編譯時(shí)就要用-L/usr/X11R6/1ib
9、-1X11參數(shù),-L參數(shù)跟著的是庫(kù)文件所 在的目錄名。再比如我們把libtest.so 放在 /aaa/bbb/ccc 目錄下,那鏈接參數(shù)就是 - L/aaa/bbb/ccc -ltest另外,大部分libxx.so只是一個(gè)鏈接,以RH9為例,比如libm.so它鏈接到 /lib/libm.so.x , /lib/libm.so.6 又鏈接到 /lib/libm-2.3 .2.50 ,如果沒(méi)有這樣的鏈接,還是會(huì)出錯(cuò),因?yàn)?1d只會(huì)找libxx.so,所以如果你要 用到xx庫(kù),而只有l(wèi)ibxx.so.x或者libxx-x.x.x.so,做一個(gè)鏈接就可以了ln -s libxx-x.x.x.so
10、libxx.so手工來(lái)寫鏈接參數(shù)總是很麻煩的,還好很多庫(kù)開發(fā)包提供了生成鏈接參數(shù)的程序,名字一般叫xx-config, 一般放在/usr/bin目錄下,比如gtk1.2的鏈接參數(shù)生成程序是gtk-config,執(zhí)行g(shù)tk-config Tibs就能得到以下輸 出 ” -L/usr/lib-L/usr/X11R6/lib -lgtk -lgdk -rdynamic-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm ”,這就是編譯一個(gè) gtk1.2程序所需的gtk鏈接參數(shù),xxx-config除了 -libs參數(shù)外還有一個(gè)參數(shù)是- cflags 用來(lái)生成頭文件包
11、含目錄的,也就是-I 參數(shù),在下面我們將會(huì)講到。你可以試試執(zhí)行g(shù)tk-config Tibs pflags,看看輸出結(jié)果現(xiàn)在的問(wèn)題就是怎樣用這些輸出結(jié)果了,最笨的方法就是復(fù)制粘貼或者照抄,聰明的辦法是在編譯命令行里加入這個(gè)xx-configTibstflags、,比如編譯一個(gè) gtk 程序:GCC gtktest.cgtk-config4ibs flags這樣就差不多了。注意 不是單引號(hào),而 是 1 鍵左邊那個(gè)鍵。除了 xxx-config以外,現(xiàn)在新的開發(fā)包一般都用 pkg-config來(lái)生成鏈接參 數(shù),使用方法跟xxx-config類似,但xxx-config是針對(duì)特定的開發(fā)包,但pkg-
12、 config 包含很多開發(fā)包的鏈接參數(shù)的生成,用pkg-config Hist-all命令可以列出所支持的所有開發(fā)包,pkg-config的用法就是 pkg -config pagNameTibstflags,其中pagName是包名,是pkg-configTist-all里列出名單中的一個(gè),比如 gtk1.2 的名字就是 gtk+, pkg-config gtk+ -libs -cflags 的作用跟 gtk-config -libs - cflags是一樣的。比如:GCC gtktest.c pkg-config gtk+libs -cflags-include 和-I-include
13、用來(lái)包含頭文件,但一般情況下包含頭文件都在源碼里用#includexxx實(shí)現(xiàn),-include參數(shù)很少用。-I參數(shù)是用來(lái)指定頭文件目錄, /usr/include目錄一般是不用指定的,GCC知道去那里找,但是如果頭文件不在 /usr/include 里我們就要用 -I 參數(shù)指定了,比如頭文件放在/myinclude 目錄里,那編譯命令行就要加上 -I/myinclude 參數(shù)了,如果不加你會(huì)得到一個(gè)” xx.h:Nosuchfileordirectory 的錯(cuò)誤。 ” -I 參數(shù)可以用相對(duì)路徑,比如頭文件在當(dāng)前目錄,可以用-I.來(lái)指定。上面我們提到的 cflags參數(shù)就是用來(lái)生成-I參數(shù)的。-
14、 DMACRO以字符串“1定義MACRO宏。- DMACRO=DEFNU字符串 “ DEFNI義 MACRO宏。- UMACRO取消對(duì)MACRO宏的定義。- w 不生成任何警告信息。-Wall顯示所有警告信息,可將 Wall看成Warn和all, GC魏譯選項(xiàng)有許多 可以聯(lián)合的選項(xiàng),如-lm(l選項(xiàng)和libm.so)-static禁止使用共享連接。-shared 編譯共享庫(kù)時(shí)會(huì)用到,比如 GCC-sharedtest.c-olibtest.so4、GCC的錯(cuò)誤類型及對(duì)策GC魏譯器如果發(fā)現(xiàn)源程序中有錯(cuò)誤,就無(wú)法繼續(xù)進(jìn)行,也無(wú)法生成最終 的可執(zhí)行文件。為了便于修改,GCC合出錯(cuò)誤資訊,我們必須對(duì)這
15、些錯(cuò)誤資訊 逐個(gè)進(jìn)行分析、處理,并修改相應(yīng)的語(yǔ)言,才能保證源代碼的正確編譯連接。GCC合出的錯(cuò)誤資訊一般可以分為四大類,下面我們分別討論其產(chǎn)生的原因和 對(duì)策。第一類:C語(yǔ)法錯(cuò)誤錯(cuò)誤資訊:文件source.c中第n行有語(yǔ)法錯(cuò)誤(syntexerrror)。這種類型的錯(cuò) 誤,一般都是C語(yǔ)言的語(yǔ)法錯(cuò)誤,應(yīng)該仔細(xì)檢查源代碼文件中第 n行及該行之 前的程序,有時(shí)也需要對(duì)該文件所包含的頭文件進(jìn)行檢查。有些情況下,一個(gè)很簡(jiǎn)單的語(yǔ)法錯(cuò)誤,GC族給出一大堆錯(cuò)誤,我們最主要的是要保持清醒的頭 腦,不要被其嚇倒,必要的時(shí)候再參考一下C語(yǔ)言的基本教材。第二類:頭文件錯(cuò)誤錯(cuò)誤資訊:找不到頭文件head.h(Cannot
16、findincludefilehead.h)。這類錯(cuò)誤是 源代碼文件中的包含頭文件有問(wèn)題,可能的原因有頭文件名錯(cuò)誤、指定的頭文件所在目錄名錯(cuò)誤等,也可能是錯(cuò)誤地使用了雙引號(hào)和尖括號(hào)。第三類:檔案庫(kù)錯(cuò)誤錯(cuò)誤資訊:連接程序找不到所需的函數(shù)庫(kù),例如:ld:-lm:Nosuchfileordirectory這類錯(cuò)誤是與目標(biāo)文件相連接的函數(shù)庫(kù)有錯(cuò)誤,可能的原因是函數(shù)庫(kù)名錯(cuò)誤、指定的函數(shù)庫(kù)所在目錄名稱錯(cuò)誤等,檢查的方法是使用 find 命令在可能的 目錄中尋找相應(yīng)的函數(shù)庫(kù)名,確定檔案庫(kù)及目錄的名稱并修改程序中及編譯選項(xiàng)中的名稱。第四類:未定義符號(hào)錯(cuò)誤資訊:有未定義的符號(hào)(Undefinedsymbol)。
17、這類錯(cuò)誤是在連接過(guò)程中出 現(xiàn)的,可能有兩種原因:一是使用者自己定義的函數(shù)或者全局變量所在源代碼 文件,沒(méi)有被編譯、連接,或者干脆還沒(méi)有定義,這需要使用者根據(jù)實(shí)際情況修改源程序,給出全局變量或者函數(shù)的定義體;二是未定義的符號(hào)是一個(gè)標(biāo)準(zhǔn)的庫(kù)函數(shù),在源程序中使用了該庫(kù)函數(shù),而連接過(guò)程中還沒(méi)有給定相應(yīng)的函數(shù)庫(kù)的名稱,或者是該檔案庫(kù)的目錄名稱有問(wèn)題,這時(shí)需要使用檔案庫(kù)維護(hù)命令ar檢查我們需要的庫(kù)函數(shù)到底位于哪一個(gè)函數(shù)庫(kù)中,確定之后,修改GCC連接選項(xiàng)中的-1和-L項(xiàng)。排除編譯、連接過(guò)程中的錯(cuò)誤,應(yīng)該說(shuō)這只是程序設(shè)計(jì)中最簡(jiǎn)單、最基本的一個(gè)步驟,可以說(shuō)只是開了個(gè)頭。這個(gè)過(guò)程中的錯(cuò)誤,只是我們?cè)谑褂?C語(yǔ) 言描述一個(gè)算法中所產(chǎn)生的錯(cuò)誤,是比較容易排除的。我們寫一個(gè)程序,到編譯、連接通過(guò)為止,應(yīng)該說(shuō)剛剛開始,程序在運(yùn)行過(guò)程中所出現(xiàn)的問(wèn)題,是算法設(shè)計(jì)有問(wèn)題,說(shuō)得更玄點(diǎn)是對(duì)問(wèn)題的認(rèn)識(shí)和理解不夠,還需要更加深入地測(cè)試、調(diào)試和修改。一個(gè)程序,稍為復(fù)雜的程序,往往要經(jīng)過(guò)多次的編譯、連接和測(cè)試、修改。下面我們學(xué)習(xí)的程序維護(hù)、調(diào)試工具和版本維護(hù)就是在程序調(diào)試、測(cè)試過(guò)程中使用的,用來(lái)解決調(diào)測(cè)階段所出現(xiàn)的問(wèn)題。5、幾個(gè)相關(guān)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《空間插值方法簡(jiǎn)介》課件
- 美容店房屋出租合同(2025年度)美容美發(fā)行業(yè)專用
- 二零二五年度田地租賃合同農(nóng)業(yè)金融服務(wù)創(chuàng)新合作協(xié)議
- 《情商故事小分享》課件
- 《品牌形象塑造》課件
- 《工業(yè)化與城市化》課件
- 二零二五年度耐火材料新產(chǎn)品研發(fā)與市場(chǎng)推廣合同
- 二零二五年度母豬養(yǎng)殖與農(nóng)村土地流轉(zhuǎn)合作合同
- 《電路向量法》課件
- 人工智能推動(dòng)大健康產(chǎn)業(yè)高質(zhì)量發(fā)展的意義
- 醫(yī)保違規(guī)檢討書
- 鋼結(jié)構(gòu)實(shí)習(xí)報(bào)告
- 2024年建房四鄰協(xié)議范本
- FTTR-H 全光組網(wǎng)解決方案裝維理論考試復(fù)習(xí)試題
- 2024年廣東佛山市中醫(yī)院三水醫(yī)院招聘61人歷年高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 測(cè)繪保密協(xié)議書保密協(xié)議(2024版)
- 原發(fā)性血小板減少性紫癜患者的生活質(zhì)量
- HG20202-2014 脫脂工程施工及驗(yàn)收規(guī)范
- 基層醫(yī)療機(jī)構(gòu)公共衛(wèi)生健康教育工作手冊(cè)(各類表格模板)
- 2024年內(nèi)蒙古中考地理生物試卷(含答案)
- LY/T 3378-2024木蠟油地板
評(píng)論
0/150
提交評(píng)論