Linux嵌入式開發(fā)學習指南之GCC工具_第1頁
Linux嵌入式開發(fā)學習指南之GCC工具_第2頁
Linux嵌入式開發(fā)學習指南之GCC工具_第3頁
Linux嵌入式開發(fā)學習指南之GCC工具_第4頁
Linux嵌入式開發(fā)學習指南之GCC工具_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、【目錄】1、GCC介2、GCC的執(zhí)行過程3、GCC的基本用法和選項4、GCC的錯誤類型及對策5、幾個相關的環(huán)境變量1、GC漪介Linux系統(tǒng)下的GCC(GNU C Compiler是GNU推出的功能強大、性能優(yōu)越 的多平臺編譯器,是 GNU 的代表作品之一。GCC是可以在多種硬體平臺上編譯出可執(zhí)行程序的超級編譯器,其執(zhí)行效 率與一般的編譯器相比平均效率要高20%30%。GC魏譯器能將C、C+畸言源程序、匯程式化序和目標程序編譯、連接成可執(zhí)行文件,如 果沒有給出可執(zhí)行文件的名字,GCCa生成一個名為a.out的文件。在Linux系 統(tǒng)中,可執(zhí)行文件沒有統(tǒng)一的后綴,系統(tǒng)從文件的屬性來區(qū)分可執(zhí)行文件

2、和不 可執(zhí)行文件。而GCC則通過后綴來區(qū)別輸入文件白類別,下面我們來介紹GCC所遵循的部分約定規(guī)則。.c為后綴的文件,C語言源代碼文件;.a為后綴的文件,是由目標文件構成的檔案庫文件;.C, .cc或.cxx為后綴的文件,是C+堿代碼文件;.h 為后綴的文件,是程序所包含的頭文件;.i為后綴的文件,是已經(jīng)預處理過的 C源代碼文件;.ii為后綴的文件,是已經(jīng)預處理過的 C+礴代碼文件;.m為后綴的文件,是Objective-C源代碼文件;.o 為后綴的文件,是編譯后的目標文件;.s 為后綴的文件,是匯編語言源代碼文件;.S為后綴的文件,是經(jīng)過預編譯的匯編語言源代碼文件。2、GCC的執(zhí)行過程雖然我

3、們稱GCC是C語言的編譯器,但使用 GCC由C語言源代碼文件生成 可執(zhí)行文件的過程不僅僅是編譯的過程,而是要經(jīng)歷四個相互關聯(lián)的步驟:預處理(也稱預編譯,Preprocessing)編譯(Compilation)、匯編(Assembly和連接 (Linking)。命令GCC首先調(diào)用cpp進行預處理,在預處理過程中,對源代碼文件中的 文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調(diào)用cc1進 行編譯,這個階段根據(jù)輸入文件生成以 .o 為后綴的目標文件。匯編過程是針對匯編語言的步驟,調(diào)用as進行工作,一般來講,.S為后綴的匯編語言源代碼文 件和匯編、 .s 為后綴的匯

4、編語言文件經(jīng)過預編譯和匯編之后都生成以 .o 為后綴 的目標文件。當所有的目標文件都生成之后,GCCM調(diào)用ld來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執(zhí)行程 序中的恰當?shù)奈恢?,同時,該程序所調(diào)用到的庫函數(shù)也從各自所在的檔案庫中 連到合適的地方。3、GCC的基本用法和選項在使用GCC扁譯器的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名 稱。GC魏譯器的調(diào)用參數(shù)大約有100多個,其中多數(shù)參數(shù)我們可能根本就用 不到,這里只介紹其中最基本、最常用的參數(shù)。GCC最基本的用法是:GCC options filenames其中 options 就是編譯器所需要的參數(shù),

5、 filenames 給出相關的文件名稱。- c,只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。- o output_filename ,確定輸出文件的名稱為 output_filename ,同時這個名稱不能和源文件同名。如果不給出這個選項,GCCM給出預設的可執(zhí)行文件a.out。- g,產(chǎn)生符號調(diào)試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行 調(diào)試,我們就必須加入這個選項。- E只運行C預編譯器。- O,對程序進行優(yōu)化編譯、連接,采用這個選項,整個源代碼會在編譯、 連接過程中進行優(yōu)化處理,這樣產(chǎn)生

6、的可執(zhí)行文件的執(zhí)行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。- O2,比-O更好的優(yōu)化編譯、連接,當然整個編譯、連接過程會更慢。- Idirname ,將 dirname 所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數(shù)。C程序中的頭文件包含兩種情況:A)#includeB)#include “ myinc.h ”其中,A類使用尖括號( ),B類使用雙引號(“?!睂τ贏類,預處理程序 cpp在系統(tǒng)預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對于 B類, cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴 cpp,如果在當前目錄中 沒有找到需要

7、的文件,就到指定的 dirname 目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用 -I 選項 給出搜索路徑。- 1 和-L- l 參數(shù)就是用來指定程序要鏈接的庫, -l 參數(shù)緊接著就是庫名,那么庫名跟真正的庫文件名有什么關系呢?就拿數(shù)學庫來說,他的庫名是m ,他的庫文件名是libm.so,很容易看出,把庫文件名的頭lib和尾.so去掉就是庫名了好了現(xiàn) 在我們知道怎么得到庫名,當我們自已要用到一個第三方提供的庫名字libtest.so ,那么我們只要把libtest.so 拷貝到 /usr/lib 里,編譯時加上 -ltest 參數(shù),我們就能用上l

8、ibtest.so 庫了(當然要用 libtest.so 庫里的函數(shù),我們還需要與libtest.so配套的頭文件)放在/lib和/usr/lib和/usr/local/lib里的庫直接用-1參數(shù)就能鏈接了,但如果 庫文件沒放在這三個目錄里,而是放在其他目錄里,這時我們只用 -l 參數(shù)的話, 鏈接還是會出錯,出錯信息大概是:“ /usr/bin/ld:cannot find-lxxx :也就是鏈接程序1d在那3個目錄里找不到libxxx.so,這 時另外一個參數(shù)-L就派上用場了,比如常用的 X11的庫,它在/usr/X11R6/1ib目 錄下,我們編譯時就要用-L/usr/X11R6/1ib

9、-1X11參數(shù),-L參數(shù)跟著的是庫文件所 在的目錄名。再比如我們把libtest.so 放在 /aaa/bbb/ccc 目錄下,那鏈接參數(shù)就是 - L/aaa/bbb/ccc -ltest另外,大部分libxx.so只是一個鏈接,以RH9為例,比如libm.so它鏈接到 /lib/libm.so.x , /lib/libm.so.6 又鏈接到 /lib/libm-2.3 .2.50 ,如果沒有這樣的鏈接,還是會出錯,因為 1d只會找libxx.so,所以如果你要 用到xx庫,而只有l(wèi)ibxx.so.x或者libxx-x.x.x.so,做一個鏈接就可以了ln -s libxx-x.x.x.so

10、libxx.so手工來寫鏈接參數(shù)總是很麻煩的,還好很多庫開發(fā)包提供了生成鏈接參數(shù)的程序,名字一般叫xx-config, 一般放在/usr/bin目錄下,比如gtk1.2的鏈接參數(shù)生成程序是gtk-config,執(zhí)行gtk-config Tibs就能得到以下輸 出 ” -L/usr/lib-L/usr/X11R6/lib -lgtk -lgdk -rdynamic-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm ”,這就是編譯一個 gtk1.2程序所需的gtk鏈接參數(shù),xxx-config除了 -libs參數(shù)外還有一個參數(shù)是- cflags 用來生成頭文件包

11、含目錄的,也就是-I 參數(shù),在下面我們將會講到。你可以試試執(zhí)行gtk-config Tibs pflags,看看輸出結果現(xiàn)在的問題就是怎樣用這些輸出結果了,最笨的方法就是復制粘貼或者照抄,聰明的辦法是在編譯命令行里加入這個xx-configTibstflags、,比如編譯一個 gtk 程序:GCC gtktest.cgtk-config4ibs flags這樣就差不多了。注意 不是單引號,而 是 1 鍵左邊那個鍵。除了 xxx-config以外,現(xiàn)在新的開發(fā)包一般都用 pkg-config來生成鏈接參 數(shù),使用方法跟xxx-config類似,但xxx-config是針對特定的開發(fā)包,但pkg-

12、 config 包含很多開發(fā)包的鏈接參數(shù)的生成,用pkg-config Hist-all命令可以列出所支持的所有開發(fā)包,pkg-config的用法就是 pkg -config pagNameTibstflags,其中pagName是包名,是pkg-configTist-all里列出名單中的一個,比如 gtk1.2 的名字就是 gtk+, pkg-config gtk+ -libs -cflags 的作用跟 gtk-config -libs - cflags是一樣的。比如:GCC gtktest.c pkg-config gtk+libs -cflags-include 和-I-include

13、用來包含頭文件,但一般情況下包含頭文件都在源碼里用#includexxx實現(xiàn),-include參數(shù)很少用。-I參數(shù)是用來指定頭文件目錄, /usr/include目錄一般是不用指定的,GCC知道去那里找,但是如果頭文件不在 /usr/include 里我們就要用 -I 參數(shù)指定了,比如頭文件放在/myinclude 目錄里,那編譯命令行就要加上 -I/myinclude 參數(shù)了,如果不加你會得到一個” xx.h:Nosuchfileordirectory 的錯誤。 ” -I 參數(shù)可以用相對路徑,比如頭文件在當前目錄,可以用-I.來指定。上面我們提到的 cflags參數(shù)就是用來生成-I參數(shù)的。-

14、 DMACRO以字符串“1定義MACRO宏。- DMACRO=DEFNU字符串 “ DEFNI義 MACRO宏。- UMACRO取消對MACRO宏的定義。- w 不生成任何警告信息。-Wall顯示所有警告信息,可將 Wall看成Warn和all, GC魏譯選項有許多 可以聯(lián)合的選項,如-lm(l選項和libm.so)-static禁止使用共享連接。-shared 編譯共享庫時會用到,比如 GCC-sharedtest.c-olibtest.so4、GCC的錯誤類型及對策GC魏譯器如果發(fā)現(xiàn)源程序中有錯誤,就無法繼續(xù)進行,也無法生成最終 的可執(zhí)行文件。為了便于修改,GCC合出錯誤資訊,我們必須對這

15、些錯誤資訊 逐個進行分析、處理,并修改相應的語言,才能保證源代碼的正確編譯連接。GCC合出的錯誤資訊一般可以分為四大類,下面我們分別討論其產(chǎn)生的原因和 對策。第一類:C語法錯誤錯誤資訊:文件source.c中第n行有語法錯誤(syntexerrror)。這種類型的錯 誤,一般都是C語言的語法錯誤,應該仔細檢查源代碼文件中第 n行及該行之 前的程序,有時也需要對該文件所包含的頭文件進行檢查。有些情況下,一個很簡單的語法錯誤,GC族給出一大堆錯誤,我們最主要的是要保持清醒的頭 腦,不要被其嚇倒,必要的時候再參考一下C語言的基本教材。第二類:頭文件錯誤錯誤資訊:找不到頭文件head.h(Cannot

16、findincludefilehead.h)。這類錯誤是 源代碼文件中的包含頭文件有問題,可能的原因有頭文件名錯誤、指定的頭文件所在目錄名錯誤等,也可能是錯誤地使用了雙引號和尖括號。第三類:檔案庫錯誤錯誤資訊:連接程序找不到所需的函數(shù)庫,例如:ld:-lm:Nosuchfileordirectory這類錯誤是與目標文件相連接的函數(shù)庫有錯誤,可能的原因是函數(shù)庫名錯誤、指定的函數(shù)庫所在目錄名稱錯誤等,檢查的方法是使用 find 命令在可能的 目錄中尋找相應的函數(shù)庫名,確定檔案庫及目錄的名稱并修改程序中及編譯選項中的名稱。第四類:未定義符號錯誤資訊:有未定義的符號(Undefinedsymbol)。

17、這類錯誤是在連接過程中出 現(xiàn)的,可能有兩種原因:一是使用者自己定義的函數(shù)或者全局變量所在源代碼 文件,沒有被編譯、連接,或者干脆還沒有定義,這需要使用者根據(jù)實際情況修改源程序,給出全局變量或者函數(shù)的定義體;二是未定義的符號是一個標準的庫函數(shù),在源程序中使用了該庫函數(shù),而連接過程中還沒有給定相應的函數(shù)庫的名稱,或者是該檔案庫的目錄名稱有問題,這時需要使用檔案庫維護命令ar檢查我們需要的庫函數(shù)到底位于哪一個函數(shù)庫中,確定之后,修改GCC連接選項中的-1和-L項。排除編譯、連接過程中的錯誤,應該說這只是程序設計中最簡單、最基本的一個步驟,可以說只是開了個頭。這個過程中的錯誤,只是我們在使用 C語 言描述一個算法中所產(chǎn)生的錯誤,是比較容易排除的。我們寫一個程序,到編譯、連接通過為止,應該說剛剛開始,程序在運行過程中所出現(xiàn)的問題,是算法設計有問題,說得更玄點是對問題的認識和理解不夠,還需要更加深入地測試、調(diào)試和修改。一個程序,稍為復雜的程序,往往要經(jīng)過多次的編譯、連接和測試、修改。下面我們學習的程序維護、調(diào)試工具和版本維護就是在程序調(diào)試、測試過程中使用的,用來解決調(diào)測階段所出現(xiàn)的問題。5、幾個相關

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論