嵌入式課件第講GNUC開發(fā)工具鏈_第1頁
嵌入式課件第講GNUC開發(fā)工具鏈_第2頁
嵌入式課件第講GNUC開發(fā)工具鏈_第3頁
嵌入式課件第講GNUC開發(fā)工具鏈_第4頁
嵌入式課件第講GNUC開發(fā)工具鏈_第5頁
已閱讀5頁,還剩37頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8講 GNU C 開發(fā)工具鏈1 GNU開發(fā)工具簡介nGNU開發(fā)工具n自由軟件n完備的工具鏈: GCC、binutils、gdb、GNU make、patch、CVS 、開發(fā)庫n命令行方式:使用稍復雜、功能強大n下載: GNU Tools開發(fā)工具組成nGNU Tools是linux環(huán)境下最主要的開發(fā)工具集,主要有以下幾個部分:n編譯開發(fā)工具:把源程序編譯為可執(zhí)行文件,如gcc。n調試工具:對執(zhí)行程序進行源碼或匯編級調試的軟件,如gdb。n軟件工程工具:用于協助多人開發(fā)或大型軟件項目的管理的軟件,如make、cvs等。GCC(GNU Compiler Collection)

2、n支持C、C+、ADA、Object C、Java、Fortran、PASCAL等語言。n主要包括:ncpp:GNU C編譯器的預處理器。ngcc:符合ISO標準的C編譯器。ng+:基本符合ISO標準的C+編譯器。ngcj:GCC的java前端。ngnat:GCC的GNU ADA 95的前端。binutilsn是一組二進制工具程序集合,是輔助GCC的主要軟件。n主要包括:nas:GNU匯編器nld:GNU鏈接器nar:創(chuàng)建歸檔文件,向庫中添加/提取obj文件nnm:列出obj文件中的符號nobjcopy:復制和轉化obj文件binutilsnobjdump:顯示對象文件的信息nranlib:根

3、據歸檔文件中內容建立索引nreadelf:顯示elf格式執(zhí)行文件中的各種信息nsize:顯示object文件和執(zhí)行文件各段的總大小nstrings:顯示文件中可以打印的字符nstrip:去掉執(zhí)行文件中多余的信息(如調試信息)ngprof:用來顯示圖表檔案數據GNU開發(fā)工具的使用2 GCC 的使用n基本語法 gcc options filenamesn說明:n在gcc后面可以有多個編譯選項,同時進行多個編譯操作。很多的gcc選項包括一個以上的字符。因此你必須為每個選項指定各自的連字符。例如,下面的兩個命令是不同的: gcc -p -g test1.c gcc -pg 當你不用任何選項編譯一個程序

4、時,GCC將會建立(假定編譯成功)一個名為a.out的可執(zhí)行文件。 gcc選項n-o選項 你能用 -o 編譯選項來為將產生的可執(zhí)行文件指定一個文件名來代替 a.out。 例:gcc o count -c選項:告訴GCC僅把源代碼編譯為目標代碼而跳過匯編和連接的步驟。這個選項使用的非常頻繁,因為它使得編譯多個C程序時速度更快并且更易于管理。缺省時GCC建立的目標代碼文件有一個.o的擴展名。 例:gcc c test2.cgcc選項n-E 只運行 C 預編譯器。 n-S 編譯選項告訴 gcc 在為 C 代碼產生了匯編語言文件后停止編譯。n-shared 生成共享目標文件。通常用在建立共享庫時。 n

5、-static 禁止使用共享連接。 n警告選項:警告選項:n在在gccgcc中用開關中用開關-Wall-Wall控制警告信息,使用示例命令如下:控制警告信息,使用示例命令如下: gcc gcc Wall -o test3_1 test3_1.cWall -o test3_1 test3_-w -w 不生成任何警告信息。不生成任何警告信息。查找選項ngcc一般使用默認路徑查找頭文件和庫文件。如果文件所用的頭文件或庫文件不在缺省目錄下,則編譯時要指定它們的查找路徑。n-I選項:指定頭文件的搜索目錄例:gcc I/export/home/st o test1 -L選項:指定庫文件的搜索目錄例:gcc

6、 L/usr/X11/R6/lib o test1 test1.c多個源文件生成一個可執(zhí)行文件 問題:有多個源文件時,如何生成一個可執(zhí)行文件?n方法1:gcc Wall o mytest test1.c test2.c 方法2:gcc-Wall -c test1.cgcc-Wall c test2.cgcc-Wall c test3.c gcc o mytest test1.o test2.o test3.o優(yōu)化選項 n優(yōu)化選項可以使GCC在耗費更多編譯時間和犧牲易調試性的基礎上產生更小更快的可執(zhí)行文件。這些選項中最典型的是-O和-O2選項。n-O0 不進行優(yōu)化處理。n-O選項:告訴GCC對源

7、代碼進行基本優(yōu)化。這些優(yōu)化在大多數情況下都會使程序執(zhí)行的更快。n-O2選項:告訴GCC 產生盡可能小和盡可能快的代碼。-O2選項將使編譯的速度比使用-O時慢。但通常產生的代碼執(zhí)行速度會更快。n-O3選項:比 -O2 更進一步優(yōu)化,包括 inline 函數。 版本選項n-v選項n用戶將會得到自己目前正在使用的gcc的版本及與版本相關的一些信息。 gcc -v 將得到如下結果: Reading specs from /usr/lib/gcc-lib/i486-box-linux/2.7.2/specs gcc version 2.7.2n-V 選項n如果安裝了多個版本的gcc,并且想強制執(zhí)行其中的

8、某個版本,可以用命令通知系統(tǒng)用戶要使用的版本。 gcc -V2.6.3 -v宏定義選項n-D MACRO以字符串“1”定義 MACRO 宏。 n-D MACRO=DEFN以字符串“DEFN”定義 MACRO 宏。 n-U MACRO取消對 MACRO 宏的定義。 調試和剖析選項 n使用調試選項后,gcc在進行編譯的時候,在目標文件(.o)和創(chuàng)建的可執(zhí)行文件中插入額外信息,這些額外信息使gdb能夠判斷編譯過的代碼和源代碼之間的關系。n-g選項:告訴GCC產生能被 GNU 調試器使用的調試信息以便調試你的程序。例:gcc g o test3 -pg選項:告訴GCC在你的程序里加入額外的代碼,執(zhí)行時

9、,產生gprof用的剖析信息以顯示你的程序的耗時情況。n使用gdb調試工具,命令行如下: 例:gcc ggdb3 o test3 test3.c 3 調試工具gdbnGDB調試器簡介 ngdb 的常用命令ngdb應用實例 gdb 簡介nLinux系統(tǒng)中包含了GNU 調試程序gdb,它是一個用來調試C和 C+ 程序的調試器??梢允钩绦蜷_發(fā)者在程序運行時觀察程序的內部結構和內存的使用情況。ngdb 所提供的一些功能如下所示:n運行程序,設置所有的能影響程序運行的參數和環(huán)境;n控制程序在指定的條件下停止運行; n當程序停止時,可以檢查程序的狀態(tài);n修改程序的錯誤,并重新運行程序; n動態(tài)監(jiān)視程序中變

10、量的值; n可以單步逐行執(zhí)行代碼,觀察程序的運行狀態(tài)。n分析崩潰程序的產生的core文件gdb的特點ngdb的功能非常強大n到目前為止,gdb已能夠支持Moduls-2、Chill、Pascal和FORTRAN程序的調試,但是調試這些語言的源程序時有一些功能還不能使用。n例如調試FORTRAN程序時還不支持表達式的輸入、輸出變量或類FORTRAN的詞法。 ngdb程序調試的對象是可執(zhí)行文件,而不是程序的源代碼文件。n然而,并不是所有的可執(zhí)行文件都可以用gdb調試。如果要讓產生的可執(zhí)行文件可以用來調試,需在執(zhí)行gcc指令編譯程序時,加上-g參數,指定程序在編譯時包含調試信息。n調試信息包含程序里

11、的每個變量的類型和在可執(zhí)行文件里的地址映射以及源代碼的行號。ngdb 利用這些信息使源代碼和機器碼相關聯。 gdb是一個用來調試C和C+程序的常用調試工具之一。 Gdb的幫助n在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有: naliases:命令別名 nbreakpoints:斷點定義; ndata:數據查看; nfiles:指定并查看文件; nrunning:程序執(zhí)行; nstack:調用棧查看; nstatu:狀態(tài)查看; ntracepoints:跟蹤程序執(zhí)行。 n后跟命令的分類名,可獲得該類命令的詳細清單 基本gdb命令(1/2)nfile命令:裝入想要調試的可執(zhí)行文

12、件。 ncd命令:改變工作目錄。 npwd命令:返回當前工作目錄。 nrun命令:執(zhí)行當前被調試的程序。 nkill命令:停止正在調試的應用程序。 nlist命令:列出正在調試的應用程序的源代碼。 nbreak命令:設置斷點。 nwatch命令:設置監(jiān)視點,監(jiān)視表達式的變化。 nnext命令:執(zhí)行下一條源代碼,但是不進入函數內部。也就是說,將一條函數調用作為一條語句執(zhí)行。執(zhí)行這個命令的前提是已經run,開始了代碼的執(zhí)行?;緂db命令(2/2)nstep命令:執(zhí)行下一條源代碼,進入函數內部。如果調用了某個函數,會跳到函數所在的代碼中等候一步步執(zhí)行。執(zhí)行這個命令的前提是已經用run開始執(zhí)行代碼。

13、 ndisplay命令:在應用程序每次停止運行時顯示表達式的值。ninfo break命令:顯示當前斷點列表,包括每個斷點到達的次數ninfo files命令:顯示調試文件的信息。 ninfo func命令:顯示所有的函數名。 nprint命令;顯示表達式的值。 ndelete命令:刪除斷點。指定一個斷點號碼,則刪除指定斷點。不指定參數則刪除所有的斷點。 nShell命令:執(zhí)行Linux Shell命令。 nmake命令:不退出gdb而重新編譯生成可執(zhí)行文件。 nQuit命令:退出gdb。 4 GNU make和makefile nGNU make概述nMakefile 的基本結構nMakef

14、ile中的變量nGNU make 的主要預定義變量nMakefile的隱含規(guī)則 nmake命令行選項 GNU make概述n在開發(fā)項目中,通常利用 make 工具來自動完成編譯工作。這些工作包括:利用這種自動編譯可大大簡化開發(fā)工作,避免不必要的重新編譯。 nmake 工具通過一個稱為 makefile 的文件來完成并自動維護編譯工作。makefile 需要按照某種語法進行編寫,其中說明了如何編譯各個源文件并連接生成可執(zhí)行文件,并定義了源文件之間的依賴關系。 當修改了其中某個源文件時,如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。 n默認情況下,GNU make 工具在當前工

15、作目錄按如下順序搜索 makefile: n GNUmakefile n makefile n Makefile makefile舉例nLinux程序員使用第三種文件名Makefile。因為第一個字母是大寫,通常被列在一個目錄的文件列表的最前面。 n如果要使用其他文件作為 makefile,則可利用類 似下面的 make 命令選項指定 makefile 文件: $ make -f Makefile.debug n例1:一個簡單的makefile prog:prog1.o prog2.o gcc prog1.o prog2.o -o prog prog1.o:prog1.c lib.h gcc

16、-c -I. -o prog1.o prog1.c prog2.o:prog2.c gcc -c prog2.c Makefile 的基本結構(1/2)nMakefile是一個文本形式的數據庫文件,其中包含一些規(guī)則來告訴make處理哪些文件以及如何處理這些文件。n規(guī)則主要是描述哪些文件(稱為target目標文件,不要和編譯時產生的目標文件相混淆)是從哪些別的文件(稱為dependency依賴文件)中產生的,以及用什么命令(command)來執(zhí)行這個過程。n依靠這些信息,make會對磁盤上的文件進行檢查,如果目標文件的生成或被改動時的時間(稱為該文件時間戳)至少比它的一個依賴文件還舊的話,mak

17、e就執(zhí)行相應的命令,以更新目標文件。n目標文件不一定是最后的可執(zhí)行文件,可以是任何一個中間文件并可以作為其他目標文件的依賴文件。Makefile 的基本結構(2/2)nMakefile規(guī)則的一般形式如下:target:dependency dependency(tab) n一個Makefile文件主要含有一系列的規(guī)則,每條規(guī)則包含以下內容。n一個目標(target),即make最終需要創(chuàng)建的文件,如可執(zhí)行文件和目標文件;目標也可以是要執(zhí)行的動作,如“clean”。n一個或多個依賴文件(dependency)列表,通常是編譯目標文件所需要的其他文件。n一系列命今(command),是make執(zhí)行

18、的動作,通常是把指定的相關文件編譯成目標文件的編譯命令,每個命令占一行,且每個命令行的起始字符必須為TAB字符。n除非特別指定,否則make的工作目錄就是當前目錄。target是需要創(chuàng)建的二進制文件或目標文件,dependency是在創(chuàng)建target時需要用到的一個或多個文件的列表,命令序列是創(chuàng)建target文件所需要執(zhí)行的步驟,比如編譯命令。 Makefile實例(1/4)# 以#開頭的為注釋行 test:prog.o code.ogcc o test prog.o code.o prog.o:prog.c prog.h code.hgcc c prog.c o prog.o code.o:

19、code.c code.hgcc c code.c o code.o clean:rm f *.o n上面的Makefile文件中共定義了四個目標:test、prog.o、code.o和clean。n目標從每行的最左邊開始寫,后面跟一個冒號(:),如果有與這個目標有依賴性的其他目標或文件,把它們列在冒號后面,并以空格隔開。然后另起一行開始寫實現這個目標的一組命令。n在Makefile中,可使用續(xù)行號()將一個單獨的命令行延續(xù)成幾行。但要注意在續(xù)行號()后面不能跟任何字符(包括空格和鍵)Makefile實例(2/4)n一般情況下,調用make命令可輸入:n# make targetntarget

20、是Makefile文件中定義的目標之一,如果省略target,make就將生成Makefile文件中定義的第一個目標。n對于上面Makefile的例子,單獨的一個“make”命令等價于:n# make testMakefile實例(3/4)n因為test是Makefile文件中定義的第一個目標,make首先將其讀入,然后從第一行開始執(zhí)行,把第一個目標test作為它的最終目標,所有后面的目標的更新都會影響到test的更新。n第一條規(guī)則說明只要文件test的時間戳比文件prog.o或code.o中的任何一個舊,下一行的編譯命令將會被執(zhí)行。 n但是,在檢查文件prog.o和code.o的時間戳之前,

21、make會在下面的行中尋找以prog.o和code.o為目標的規(guī)則,在第三行中找到了關于prog.o的規(guī)則,該文件的依賴文件是prog.c、prog.h和code.h。同樣,make會在后面的規(guī)則行中繼續(xù)查找這些依賴文件的規(guī)則,如果找不到,則開始檢查這些依賴文件的時間戳,如果這些文件中任何一個的時間戳比prog.o的新,make將執(zhí)行“gcc c prog.c o prog.o”命令,更新prog.o文件。Makefile實例(4/4)n以同樣的方法,接下來對文件code.o做類似的檢查,依賴文件是code.c和code.h。當make執(zhí)行完所有這些套嵌的規(guī)則后,make將處理最頂層的test

22、規(guī)則。如果關于prog.o和code.o的兩個規(guī)則中的任何一個被執(zhí)行,至少其中一個.o目標文件就會比test新,那么就要執(zhí)行test規(guī)則中的命令,因此make去執(zhí)行gcc命令將prog.o和code.o連接成目標文件test。n在上面Makefile的例子中,還定義了一個目標clean,它是Makefile中常用的一種專用目標,即刪除所有的目標模塊make的工作過程n現在來看一下make做的工作:n首先make按順序讀取makefile中的規(guī)則,n然后檢查該規(guī)則中的依賴文件與目標文件的時間戳哪個更新通過以上的分析過程,可以看到make的優(yōu)點,因為.o目標文件依賴.c源文件,源碼文件里一個簡單改

23、變都會造成那個文件被重新編譯,并根據規(guī)則鏈依次由下到上執(zhí)行編譯過程,直到最終的可執(zhí)行文件被重新連接。n例如,當改變一個頭文件的時候,由于所有的依賴關系都在Makefile里,因此不再需要記住依賴此頭文件的所有源碼文件,make可以自動的重新編譯所有那些因依賴這個頭文件而改變了的源碼文件,如果需要,再進行重新連接Makefile中的變量nMakefile里的變量就像一個環(huán)境變量。事實上,環(huán)境變量在make中也被解釋成make的變量。這些變量對大小寫敏感,一般使用大寫宇母。幾乎可以從任何地方引用定義的變量,變量的主要作用如下: n保存文件名列表。n保存可執(zhí)行命令名,如編譯器。n保存編譯器的參數。變

24、量的定義和使用nMakefile中的變量是用一個文本串在Makefile中定義的,這個文本串就是變量的值。只要在一行的開始寫下這個變量的名字,后面跟一個“”號,以及要設定這個變量的值即可定義變量,下面是定義變量的語法:VARNAME=stringn使用時,把變量用括號括起來,并在前面加上$符號,就可以引用變量的值: $VARNAME nmake解釋規(guī)則時,VARNAME在等式右端展開為定義它的字符串。n變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應該是大寫。如果變量的值發(fā)生變化,就只需要在一個地方修改,從而簡化了Makefile的維護。 Makefile變量舉

25、例n現在利用變量把前面的Makefile重寫一遍:OBJS=prog.o code.oCC=gcc test:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h$ CC c prog.c o prog.o code.o:code.c code.h$ CC c code.c o code.o clean:rm f *.o 變量的類型n除用戶自定義的變量外,make還允許使用n環(huán)境變量n使用環(huán)境變量的方法很簡單,在make啟動時,make讀取系統(tǒng)當前已定義的環(huán)境變量,并且創(chuàng)建與之同名同值的變量,因此用戶可以像在shell中一樣在Makefil

26、e中方便的引用環(huán)境變量。n需要注意的是,如果用戶在Makefile中定義了同名的變量,用戶自定義變量將覆蓋同名的環(huán)境變量n自動變量n預定義變量GNU make 的主要自動變量n$* 不包含擴展名的目標文件名稱。 n$+ 所有的依賴文件,以空格分開,并以出現的先后為序,可能包含重復的依賴文件。n$ 第一個依賴文件的名稱。 n$? 所有的依賴文件,以空格分開,這些依賴文件的修改日期比目標的創(chuàng)建日期晚。n$ 目標的完整名稱。 n$ 所有的依賴文件,以空格分開,不包含重復的依賴文件。 n$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱。例如,如果目標名稱 為 mytarget.so(image

27、.o),則 $ 為 mytarget.so,而 $% 為 image.o。 GNU make 的主要預定義變量nAR 歸檔維護程序的名稱,默認值為 ar。 nARFLAGS 歸檔維護程序的選項。 nAS 匯編程序的名稱,默認值為 as。 nASFLAGS 匯編程序的選項。 nCCC 編譯器的名稱,默認值為 cc。 nCFLAGSC 編譯器的選項。 nCPPC 預編譯器的名稱,默認值為 $(CC) -E。 nCPPFLAGSC 預編譯的選項。nCXXC+ 編譯器的名稱,默認值為 g+。 nCXXFLAGSC+ 編譯器的選項。 nFCFORTRAN 編譯器的名稱,默認值為 f77。 nFFLAGSFORTRAN 編譯器的選項。Makefile的隱含規(guī)則 n在上面的例子中,幾個產生目標文件的命令都是從“.c”的C語言源文件和相關文件通過編譯產生“.o”目標文件,這也是一般的步驟。實際上,make可以使工作更加自動化,也就是說,make知道一些默認的動作,它有一些稱作隱含規(guī)則的內置的規(guī)則,這些規(guī)則告訴make當用戶沒有完整地給出某些命令的時候,應該怎樣執(zhí)行。Makefile的隱含規(guī)則n例如

溫馨提示

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

最新文檔

評論

0/150

提交評論