Linux 嵌入開發(fā)常用工具 第5章_第1頁
Linux 嵌入開發(fā)常用工具 第5章_第2頁
Linux 嵌入開發(fā)常用工具 第5章_第3頁
Linux 嵌入開發(fā)常用工具 第5章_第4頁
Linux 嵌入開發(fā)常用工具 第5章_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 編譯器和工程管理器 本章目的及內(nèi)容 了解GNU Binutils工具。了解最常用的GNU Binutils工具使用方法,包括鏈接工具ld、匯編工具as、目標(biāo)復(fù)制工具objcopy以及反匯編工具objdump等。 重點掌握gcc。學(xué)會安裝gcc及arm-linux-gcc工具軟件,以及如何搭建gcc的交叉編譯平臺,重點掌握GCC編譯流程及GCC編譯選項 重點掌握make文件。重點掌握的內(nèi)容包括:make文件的語法規(guī)則、變量的使用、makefile中常用函數(shù)含義,以及make文件的編寫流程。 了解autotools的用法。了解autotools中常用的工具鏈以及如何使用工具鏈自動創(chuàng)建Mak

2、efile文件 GNU Binutils工具介紹 鏈接工具ld。ld是GNU binutils工具集其中的一個,是Linkers(鏈接器)的一種。它的主要功能是把多個目標(biāo)文件、庫文件鏈接起來,并通過重定向它們的數(shù)據(jù),完成符號解析,最終形成可執(zhí)行文件。 匯編工具as 。as工具主要用來將匯編語言源程序轉(zhuǎn)換成二進(jìn)制目標(biāo)代碼 目標(biāo)復(fù)制工具objcopy 。Objcopy工具可以將一種格式的目標(biāo)文件轉(zhuǎn)化為另外一種格式的目標(biāo)文件,也可用來復(fù)制一個目標(biāo)文件的內(nèi)容到另一個文件中 地址轉(zhuǎn)換工具add2line 。add2line用來將地址轉(zhuǎn)換成文件名或行號對,以便調(diào)試程序。 變量列舉工具nm 。nm用來列出目

3、標(biāo)文件中的符號、變量(包括變量值和變量類型),使用它可以方便的幫助程序員定位及分析執(zhí)行程序。 創(chuàng)建檔案工具ar 。ar工具可以幫助用戶創(chuàng)建、修改檔案文件(archive),也可以從檔案文件中提取信息。 顯示elf文件信息工具readelf 。readelf命令可以顯示符號、段、二進(jìn)制文件格式等信息,此工具在分析編譯器如何從源代碼創(chuàng)建二進(jìn)制文件時非常有用。 列出目標(biāo)模塊大小工具size 。size命令可以列出目標(biāo)文件每一段的大小以及總體的大小 反匯編工具objdump 。objdump工具用于反編譯二進(jìn)制文件,也可以對對象文件進(jìn)行反匯編,并查看機器代碼,顯示二進(jìn)制文件信息。 打印目標(biāo)代碼工具st

4、rings。Strings打印工具可打印目標(biāo)代碼字符(至少4個字符),也可以使用選項“-n”設(shè)置字符串的最小長度。 GCC編譯器簡介 GCC是一個用于程序開發(fā)的自由編譯器。起初gcc是GNU C語言編譯器的英文縮寫,但是隨著眾多自由開發(fā)者的加入和GCC自身的發(fā)展,如今的GCC已經(jīng)成了一個包含眾多語言的編譯器了,可以編譯包括C、C+、Object C、Java、Fortran、Pascal等高級語言編寫的程序。 gcc的優(yōu)點 目前Linux下的默認(rèn)使用的C語言編譯器是GCC,它是GNU項目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng),它不僅功能非常強大,結(jié)構(gòu)也異常靈活。其優(yōu)點如下: 便于控制編譯過程 與gd

5、b調(diào)試工具結(jié)合使用 GCC提供靈活強大的代碼優(yōu)化功能 提供告警信息和擴展 GCC的交叉編譯平臺 交叉編譯,是指在一個平臺上生成另一個平臺上的可執(zhí)行代碼。所謂的平臺,實際上包含兩個概念:體系結(jié)構(gòu)(Architecture)、操作系統(tǒng)(Operating System)。一般而言,同一個體系結(jié)構(gòu)可以運行不同的操作系統(tǒng),同樣,同一個操作系統(tǒng)也可以在不同的體系結(jié)構(gòu)上運行。 交叉編譯平臺搭建 下載安裝包 解壓安裝程序 添加系統(tǒng)路徑 重新登錄計算機 使用交叉工具安裝操作 GCC編譯 GCC編譯器通過編譯選項可以讓程序員完美的控制整個編譯過程,并將C、C+語言源程序編譯成可執(zhí)行文件 。后綴名對應(yīng)的語言種類后

6、期可能進(jìn)行的操作.cC語言源程序預(yù)處理、編譯、匯編、鏈接.C/.cc/.cxxC+語言源程序預(yù)處理、編譯、匯編、鏈接.mObjective-C語言源程序預(yù)處理、編譯、匯編、鏈接.i預(yù)處理后的C文件編譯、匯編、鏈接.ii預(yù)處理后的C+文件編譯、匯編、鏈接.s/.S匯編語言源程序匯編、鏈接.o目標(biāo)文件程序鏈接.a/.so編譯后的庫文件無.h預(yù)處理的所需文件無 GCC編譯器的主要格式為: gcc 選項 要編譯的文件 選項 目標(biāo)文件 gcc有大約100多個選項,主要包括總體選項、警告選項、出錯選項、優(yōu)化選項以及體系結(jié)構(gòu)選項等 GCC編譯流程解析 預(yù)處理 編譯 匯編 鏈接實例操作 常用選項 選項對應(yīng)選項

7、的解釋-X language指定輸入文件的語言為language-E只對源文件進(jìn)行預(yù)處理,不做編譯、匯編及鏈接,GCC會忽略任何不需要預(yù)處理的輸入文件-S只進(jìn)行編譯,不做匯編及鏈接,對于每個輸入的非匯編語言文件,輸出文件都是匯編語言文件.-c只進(jìn)行匯編,不做鏈接,匯編成源文件的目標(biāo)文件,缺省狀態(tài)下生成.o文件,GCC忽略-c選項后面任何無法識別的輸入文件-o file把輸出的文件指定到file中,該選項可以輸出匯編文件、目標(biāo)文件以及可執(zhí)行文件-v打印出編譯器內(nèi)部編譯各個過程的命令行信息和編譯器版本信息 警告出錯選項 選項對應(yīng)選項的解釋-fsyntax-only檢查程序中的語法錯誤,但是不產(chǎn)生輸

8、出信息-w禁止所有警告信息-Wunused如果某個局部變量除了聲明就沒再使用,或者聲明了靜態(tài)函數(shù)但是沒有定義,或者某條語句的運算結(jié)果顯然沒有使用, 編譯器就發(fā)出警告.-Wmain如果把main函數(shù)聲明或定義成奇怪的類型,編譯器就發(fā)出警告-Werror視警告為錯誤;出現(xiàn)任何警告即放棄編譯.-Wredundant-decls如果在同一個可見域某定義多次聲明,編譯器就發(fā)出警告,即使這些重復(fù)聲明有效并且毫無差別-Wall允許gcc提供所有有用的報警信息-pedantic-error允許發(fā)出ANSI C標(biāo)準(zhǔn)所列出的全部信息 優(yōu)化選項 GCC可以對代碼進(jìn)行優(yōu)化,它通過編譯選項“-On”來控制優(yōu)化配置,其中

9、n是一個代表優(yōu)化級別整數(shù),n變化范圍一般在0到3之間,n值越大,優(yōu)化效果越好。 目錄選項 “-I 目錄”選項表示在頭文件搜素路徑中添加需要的目錄。 “-L 目錄”的功能是在庫文件的搜素路徑中添加用戶自定義的搜素的目錄名 GCC編譯性能分析 程序性能測試工具gprof gprof可以幫助用戶找出應(yīng)用程序中消耗CPU時間最多的函數(shù),同時產(chǎn)生程序運行時的函數(shù)調(diào)用關(guān)系,從而幫助用戶分析程序的運行流程。有了函數(shù)的調(diào)用關(guān)系,就可以大大提高工作效率。其格式如下: gprof 選項 用戶應(yīng)用程序 gmon.out選項選項說明-b不再輸出統(tǒng)計表格中的詳細(xì)信息,僅顯示簡要信息-p只輸出函數(shù)的調(diào)用圖-i輸出該統(tǒng)計總

10、結(jié)信息-T以傳統(tǒng)的BSD格式,打印輸出信息-q僅輸出函數(shù)的時間消耗列表-w width設(shè)置輸出的寬度-e Name不輸出函數(shù)Name及其子函數(shù)的調(diào)用圖-f Name輸出函數(shù)Name 及其子函數(shù)的調(diào)用圖-z顯示從未未使用過的函數(shù)信息-D忽略函數(shù)中未知的變量實例操作 程序覆蓋測試工具gcov gcov是gnu/gcc工具庫中的一個組件,簡稱為“程序覆蓋測試工具”,用它對程序分析,可以讓用戶知道哪部分代碼沒有使用、哪部分代碼執(zhí)行效率最高以及哪部分代碼占用cpu的時間最多。從而改善程序代碼,讓程序執(zhí)行的更快、更有效。其格式如下: gcov 選項用戶程序 選項選項含義-b表示顯示對分支的測試信息-h顯示

11、gcov的幫助信息-v顯示gcov的版本信息-n不創(chuàng)建gcov的輸出信息-f輸出每個函數(shù)的使用信息實例操作 GCC編譯使用實例 試編寫score.c、Max.c、Min.c和average.c程序,主要實現(xiàn)如下功能:從鍵盤上讀取10位同學(xué)的成績信息,使用三個子函數(shù)分別求出最高分、最低分和平均分。在程序編寫完畢后使用gcc工具編譯score.c,并使用gprof程序程序性能測試工具分析各函數(shù)的使用狀況。 實例操作 makefile工程管理器 工程管理器,顧名思義就是管理含有多個文件的工程工具。 GNU make在Linux編程中起著十分重要的作用。使用GNU 的make工具能夠比較容易的構(gòu)建一個

12、屬于用戶自己的工程,整個工程的編譯只需要一個命令就可以完成編譯、連接甚至到最后的執(zhí)行,通過makefile文件可以清晰的描述源文件之間的相互關(guān)系并自動維護(hù)編譯工作;其次,使用make工具能夠很方便的描述系統(tǒng)編譯程序的內(nèi)容、順序和方式以及如何自動管理軟件的編譯。 Makefile文件有編譯、連接的規(guī)則和語法,也有自己的書寫格式、關(guān)鍵字、函數(shù)以及語法結(jié)構(gòu)。 通常一個Makefile的結(jié)構(gòu)如下: TARGET:Dependency file COMMAND TARGET:Dependency file COMMAND TARGET:Dependency file COMMAND 實例編寫 變量基礎(chǔ)

13、在Makefile中的變量,它不僅可以代表一個文本字符串,而且可以用來代表文件名、編譯選項、程序運行的選項參數(shù)、搜索源文件的目錄以及編譯輸出的目錄。在Makefile的目標(biāo)、依賴、命令中任意引用變量的地方,在執(zhí)行make命令后,所有變量都會被變量定義的值所取代。 變量的命名可以包含字符、數(shù)字、下劃線,但絕對不可以使用含有“:”、“#”、“=”或是空字符(空格、回車等)的字符。 變量定義及使用 Makefile文件的變量定義有兩種方式,一種是遞歸展開定義法,另一種是直接展開定義法。兩者的區(qū)別在于定義的方式和展開的時機不同。兩者相同點在于,在變量定義時斗需要賦予初值,當(dāng)使用這些變量時,都需要在變量

14、名前加“$”符號。使用變量名時最好使用“()” 將變量括起來。其次,如果要使用真是的“$”符號,那么需要用“$”來代替。 遞歸展開定義法 這種變量定義法是通過“=”或者使用指示符“define”來定義變量。其格式如下所示: Var=var 其中,Var是變量名,var是賦予變量Var的值。 對使用遞歸展開定義的變量,其引用的地方是嚴(yán)格的文本替換過程。變量將會原模原樣的被字符串替代。如果此變量定義中存在對其他變量的引用,那么被引用的變量會在它被展開的同時被展開。 實例操作 直接展開定義法 為避免“遞歸展開法”定義變量的不方便,在Makefile中可以使用另外一種變量定義的方式,這種方式的變量使用

15、“:=”定義變量。其格式如下: Var :=var 其中,Var是變量名,var是賦予變量Var的值。 同遞歸定義法不同,直接展開定義法,在調(diào)用變量時,變量值中對另外變量的引用在定義時被展開。所以在變量被定義以后就是一個實際所需要定義的文本串,不再包含任何對其它變量的引用。其次,需要注意的是,使用直接定義法定義變量時,就完成了對所引用的變量的展開,因此它不能實現(xiàn)對其后定義變量的引用。實例編寫 變量分類 Makefile中變量分為自定義變量、預(yù)定義變量、自動變量和環(huán)境變量 預(yù)定義變量。包含常見的編譯器、匯編器的名稱及其編譯選項 變量含義AR庫文件維護(hù)程序的名稱,默認(rèn)值為arAS匯編程序的名稱,默

16、認(rèn)值為asCCC編譯器的名稱CPPC預(yù)編譯器的名稱,默認(rèn)值為$(CC) ECXXC+編譯器的名稱,默認(rèn)值為g+PCPascal編譯器的名稱FCFORTRAN編譯器的名稱,默認(rèn)值為f77RM文件刪除程序的名稱,默認(rèn)值為rm fARFLAGS庫文件維護(hù)程序的選項,無默認(rèn)值A(chǔ)SFLAGS匯編程序的選項,無默認(rèn)值CFLAGSC編譯器的選項,無默認(rèn)值CPPFLAGSC預(yù)編譯的選項,無默認(rèn)值CXXFLAGSC+編譯器的選項,無默認(rèn)值FFLAGSFORTRAN編譯器的選項,無默認(rèn)值 自動變量 為了簡化Makefile的編寫,Makefile引入自動變量,自動變量可以代表編譯語句中出現(xiàn)的目標(biāo)文件和依賴文件等。

17、使用自動變量可以為Makefile的編寫提供便捷。自動變量含義$表示當(dāng)前規(guī)則中的完整目標(biāo)文件名$?新修改過的依賴文件列表,即所有時間戳比目標(biāo)文件晚的依賴文件,并以空格分開$*不包含擴展名的目標(biāo)文件名$當(dāng)前規(guī)則中的第一個依賴文件名$%當(dāng)目標(biāo)文件為庫文件時,該變量為庫文件名$當(dāng)前規(guī)則中的所有文件列表$+所有依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件實例操作 實例: 將下面的Makefile程序使用預(yù)定義變量、自動變量以及自定義變量改寫。 wth:wth.o sun.o wang.o gcc wth.o sun.o wang o wth wth.o:wth.c head1.h

18、gcc wall O g c wth.c o wth.o sun.o:sun.c head2.h gcc wall O gc sun.c o sun.o wang.o:wang.c gcc wall O gc sun.c o sun.o Makefile常用函數(shù) 字符替換函數(shù)subst $ ( subst A ,B, text) 此函數(shù)的作用是將文本“text”中的每一個“A”字符用字符“B”替換 模式替換函數(shù)patsubst 模式替換函數(shù)patsubst的格式為: $(patsubst A, B, text) 此函數(shù)的作用是將文本“text”中符合格式為“A”的字符,用格式“B”替換,在格式

19、“A”“B”中可使用通配符。參數(shù)“A”中經(jīng)常使用模式通配符“%”來代表一個單詞中的若干字符。此函數(shù)經(jīng)常用于文件后綴名的轉(zhuǎn)化,同上文提到的“變量替換引用”有異曲同工之處。 空格壓縮函數(shù)strip 空格壓縮函數(shù)strip的格式如下: $(strip text) 此函數(shù)的作用表示將“text”中的多余空格進(jìn)行壓縮,(包括前導(dǎo)或者結(jié)尾的空格字符)并將多個空格變?yōu)閱蝹€空格。 字符串查找函數(shù)findstring 字符串查找函數(shù)findstring的格式如下: $(findstring A, text) 此函數(shù)的作用表示在“text”中查找字符串“A”,如果找到則其返回值為“A”,否則為空 字符排序函數(shù)so

20、rt 字符排序函數(shù)sort的格式如下:$(sort text)此函數(shù)的作用是將“text”中的字按字母順序排序,并去掉其中重復(fù)的單詞。其輸出由單個空格隔開的單詞列表。如果第一個字母相同則比較第二個,依次類推。 取單詞函數(shù)word 取單詞函數(shù)word的格式如下: $(word N, text) 此函數(shù)的作用是將“text”中的第N個單詞取出,并返回這個單詞。如果不存在第N個單詞,則返回值為空 取單詞串函數(shù)wordlist 取單詞串函數(shù)wordlist的格式如下: $(wordlist N1, N2, text) 此函數(shù)的作用表示取出“text”中第N1個到第N2個單詞,其中N1,N2表示表示單詞

21、在“text”的位置數(shù)字。在操作過程中,如果N1大于N2,則返回值為空;如果N1比“text”中的單詞數(shù)大時,返回值同樣為空;如果N1小于“text”中單詞數(shù),但是N2大于“text”中單詞數(shù),那么將返回從第N1個到“text”結(jié)束時的單詞串。 統(tǒng)計單詞數(shù)函數(shù)words 統(tǒng)計單詞數(shù)函數(shù)words的格式如下: $(words text) 此函數(shù)表示統(tǒng)計text中的單詞數(shù)目。 過濾函數(shù) filter 過濾函數(shù)filter的格式如下: $(filter A,text) 此命令表示將在text中尋找由空格隔開并且匹配格式為“A”字,去除不符合格式為“A”的字符。 取目錄函數(shù)dir 取目錄函數(shù)dir的格

22、式為: $(dir text) 此命令表示取出text中每個文件的路徑部分。文件名路徑部分包括從文件首字符到文件最后一個斜杠之前的一切字符,如果文件前沒有目錄斜杠,則默認(rèn)表示這個文件是當(dāng)前目錄下文件,并輸出為“./” 取文件名函數(shù)notdir 取文件名函數(shù)notdir的格式為: $(notdir text) 此命令表示取出text中的每個文件名。文件名即除了路徑部分的一切字符。 添加文件后綴函數(shù)addsuffix 添加文件后綴函數(shù)addsuffix格式如下: $(addsuffix A, text) 此函數(shù)的作用表示將text中每個文件名后添加后綴“A” 添加文件前綴函數(shù)addprefix 添

23、加文件后綴函數(shù)addprefix格式如下: $(addprefix A, text) 此函數(shù)的作用表示將text中每個文件名后添加前綴“A” 判斷函數(shù) 判斷函數(shù)if的格式如下: $(if A, B ,C) 此函數(shù)的作用是判斷A,對變量A展開后,如果“A”的結(jié)果非空,則條件為真,同時將B作為函數(shù)的表達(dá)式;如果條件為假,則將C作為函數(shù)的表達(dá)式。 shell函數(shù) Shell函數(shù)的格式如下: $(shell shell-command) 此函數(shù)的作用是在Makefile中執(zhí)行“shell-command”命令,并將它的執(zhí)行結(jié)果返回Makefile。 Makefile規(guī)則語法 顯式規(guī)則 顯式規(guī)則描述了如

24、何將“依賴文件”轉(zhuǎn)變?yōu)椤澳繕?biāo)文件”的方法,書寫這種規(guī)則的Makefile,需要明確地給出目標(biāo)文件、目標(biāo)依賴文件的列表以及更新目標(biāo)文件所需要的命令。 存在weed.c,wth.c以及編譯文件Makefile,如果使用Makefile中代碼如下,能否正常編譯出example可執(zhí)行文件?為什么?Makefile源程序:# File Makefilevar:=$(shell ls) #命令行1obj:=$(patsubst %.c,%.o,$(var) #命令行2CFLAGS:=-O -g -cCC:=gccexample:$(wordlist 1,2,$(obj) $(CC) $ -o $ $(wo

25、rd 1,$(obj):$(word 1,$(var) $(CC) $(CFLAGS) $ -o $ $(word 2,$(obj):$(word 2,$(var) $(CC) $(CFLAGS) $ -o $ 隱式規(guī)則 隱式規(guī)則不同于傳統(tǒng)的顯式規(guī)則。當(dāng)用戶使用隱式規(guī)則時,不需要詳細(xì)的指定編譯的具體細(xì)節(jié),而只需把文件列出即可。它可以根據(jù)要產(chǎn)生的可執(zhí)行文件和其依賴文件(典型的是根據(jù)文件名的后綴)自動推導(dǎo)出其依賴文件是如何使用默認(rèn)命令編寫規(guī)則的。 常見的隱式規(guī)則列表 語言后綴變化使用規(guī)則C編譯:將file .c變?yōu)閒ile.o$(CC) $(CPPFLAGS) $(CFLAGS) c file.c

26、 o file.oC+編譯:將file.cc變?yōu)閒ile.o$(CXX) $(CPPFLAGS) c file.cc o file.oPascal編譯:將file.p變?yōu)閒ile.o$(CP) $(PFLAGS) c file.p o file.oFortran編譯:將file.r變?yōu)閒ile.o$(CP) $(FFLAGS) c file.r o file.o 靜態(tài)模式規(guī)則 模式規(guī)則是用來定義具有相同處理規(guī)則的多個文件,它類似于顯式規(guī)則,但同顯式規(guī)則又有所差距。在模式規(guī)則中,目標(biāo)的定義需要有“%”字符。“%”表示對文件名的匹配,返回值為一個或多個任意字符。在依賴文件中同樣可以使用“%”,只是依賴文件中的“%”的取值,取決于其具體目標(biāo)。 Makefile使用實例 以下是一復(fù)雜工程中截取的一小段makefile試分析該Makefile中各代碼的功能:#Makefile copyright 1.0 #Make by bistu wthTOPDIR= $(shell pwd ) #命令行1OBJ=lib.o target.o nm.o display.o #命令行2CROS

溫馨提示

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

最新文檔

評論

0/150

提交評論