Linux下gcc的使用與開發(fā)_第1頁
Linux下gcc的使用與開發(fā)_第2頁
Linux下gcc的使用與開發(fā)_第3頁
Linux下gcc的使用與開發(fā)_第4頁
Linux下gcc的使用與開發(fā)_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Linux下下gcc的使用與開發(fā)的使用與開發(fā)2主要內(nèi)容主要內(nèi)容pgcc簡介簡介n功能功能n命令命令p利用利用gcc編譯編譯c程序程序p利用利用make工具工具簡化編譯過程簡化編譯過程nmake簡介簡介nMakefile基本格式基本格式p調(diào)試調(diào)試n靜態(tài)調(diào)試靜態(tài)調(diào)試n動態(tài)調(diào)試:動態(tài)調(diào)試:gdb調(diào)試工具的使用調(diào)試工具的使用pMakefile文件的文件的自動生成自動生成3gcc簡介簡介p名稱:名稱:nGNU project C and C+ Compiler nGNU Compiler Collection p管理與維護(hù)管理與維護(hù)nGNU項(xiàng)目項(xiàng)目 p對對C/C+編譯的控制編譯的控制n預(yù)處理(預(yù)處理(P

2、reprocessing)n編譯(編譯(Compilation)n匯編(匯編(Assembly)n鏈接(鏈接(Linking 4Gcc簡介簡介pgcc可以使程序員靈活地控制編譯過程。編譯過程可以使程序員靈活地控制編譯過程。編譯過程一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不一般可以分為下面四個(gè)階段,每個(gè)階段分別調(diào)用不同的工具進(jìn)行處理,如圖所示。同的工具進(jìn)行處理,如圖所示。預(yù)處理鏈接編譯匯編源 程 序(*.c)可執(zhí)行文件預(yù) 處 理器編譯器組譯器連接器5gcc的使用的使用p基本使用格式基本使用格式 n$ gcc 選項(xiàng)選項(xiàng) p常用選項(xiàng)及含義常用選項(xiàng)及含義gccgcc常用選項(xiàng)常用選項(xiàng)選項(xiàng)選項(xiàng)含義含義-

3、o -o filefile將經(jīng)過將經(jīng)過gccgcc處理過的結(jié)果存為文件處理過的結(jié)果存為文件filefile,這個(gè)結(jié)果文件可能是,這個(gè)結(jié)果文件可能是預(yù)處理文件、匯編文件、目標(biāo)文件或者最終的可執(zhí)行文件。預(yù)處理文件、匯編文件、目標(biāo)文件或者最終的可執(zhí)行文件。假設(shè)被處理的源文件為假設(shè)被處理的源文件為source.suffixsource.suffix,如果這個(gè)選項(xiàng)被省,如果這個(gè)選項(xiàng)被省略了,那么生成的可執(zhí)行文件默認(rèn)名稱為略了,那么生成的可執(zhí)行文件默認(rèn)名稱為a.outa.out;目標(biāo)文件;目標(biāo)文件默認(rèn)名為默認(rèn)名為source.osource.o;匯編文件默認(rèn)名為;匯編文件默認(rèn)名為source.ssourc

4、e.s;生成的;生成的預(yù)處理文件則發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備。預(yù)處理文件則發(fā)送到標(biāo)準(zhǔn)輸出設(shè)備。6gcc的常用選項(xiàng)的常用選項(xiàng)gccgcc常用選項(xiàng)常用選項(xiàng)選項(xiàng)選項(xiàng)含義含義-c-c僅對源文件進(jìn)行編譯,不鏈接生成可執(zhí)行文件。僅對源文件進(jìn)行編譯,不鏈接生成可執(zhí)行文件。在對源文件進(jìn)行查錯時(shí),或只需產(chǎn)生目標(biāo)文件在對源文件進(jìn)行查錯時(shí),或只需產(chǎn)生目標(biāo)文件時(shí)可以使用該選項(xiàng)。時(shí)可以使用該選項(xiàng)。-ggdb-ggdb在可執(zhí)行文件中加入調(diào)試信息,方便進(jìn)行程序在可執(zhí)行文件中加入調(diào)試信息,方便進(jìn)行程序的調(diào)試。如果使用中括號中的選項(xiàng),表示加入的調(diào)試。如果使用中括號中的選項(xiàng),表示加入gdbgdb擴(kuò)展的調(diào)試信息,方便使用擴(kuò)展的調(diào)試信息,方

5、便使用gdbgdb來進(jìn)行調(diào)試來進(jìn)行調(diào)試-O0-O0、1 1、2 2、33對生成的代碼使用優(yōu)化,中括號中的部分為優(yōu)對生成的代碼使用優(yōu)化,中括號中的部分為優(yōu)化級別,缺省的情況為化級別,缺省的情況為2 2級優(yōu)化,級優(yōu)化,0 0為不進(jìn)行優(yōu)為不進(jìn)行優(yōu)化。注意,采用更高級的優(yōu)化并不一定得到效化。注意,采用更高級的優(yōu)化并不一定得到效率更高的代碼。率更高的代碼。-D -D name=definitionname=definition將名為將名為namename的宏定義為的宏定義為definitiondefinition,如果中括,如果中括號中的部分缺省,則宏被定義為號中的部分缺省,則宏被定義為1 17gcc的

6、常用選項(xiàng)的常用選項(xiàng)gccgcc常用選項(xiàng)常用選項(xiàng)選項(xiàng)選項(xiàng)含義含義-I -I dirdir在編譯源程序時(shí)增加一個(gè)搜索頭文件的額外目錄在編譯源程序時(shí)增加一個(gè)搜索頭文件的額外目錄dirdir,即,即includeinclude增加一個(gè)搜索的額外目錄。增加一個(gè)搜索的額外目錄。-L -L dirdir在編譯源文件時(shí)增加一個(gè)搜索庫文件的額外目錄在編譯源文件時(shí)增加一個(gè)搜索庫文件的額外目錄dirdir-l -l librarylibrary在編譯鏈接文件時(shí)增加一個(gè)額外的庫,庫名為在編譯鏈接文件時(shí)增加一個(gè)額外的庫,庫名為librarylibrary.a.a-w-w禁止所有警告禁止所有警告-W -W warning

7、warning允許產(chǎn)生允許產(chǎn)生warningwarning類型的警告,類型的警告,warningwarning可以是:可以是:mainmain、unusedunused等很多取值,最常用是等很多取值,最常用是-Wall-Wall,表示產(chǎn)生所有警,表示產(chǎn)生所有警告。如果告。如果warningwarning取值為取值為errorerror,其含義是將所有警告作,其含義是將所有警告作為錯誤(為錯誤(errorerror),即出現(xiàn)警告就停止編譯。),即出現(xiàn)警告就停止編譯。8gcc文件擴(kuò)展名規(guī)范文件擴(kuò)展名規(guī)范 pgcc可以根據(jù)文件擴(kuò)展名執(zhí)行操作可以根據(jù)文件擴(kuò)展名執(zhí)行操作gccgcc文件擴(kuò)展名規(guī)范文件擴(kuò)展

8、名規(guī)范擴(kuò)展名擴(kuò)展名類型類型可進(jìn)行的操作方式可進(jìn)行的操作方式.c.cc c語言源程序語言源程序預(yù)處理、編譯、匯編、預(yù)處理、編譯、匯編、鏈接鏈接.C.C,.cc.cc,.cp.cp,.cpp.cpp,.c+.c+,.cxx.cxxc+c+語言源程序語言源程序預(yù)處理、編譯、匯編、預(yù)處理、編譯、匯編、鏈接鏈接.i.i預(yù)處理后的預(yù)處理后的c c語言源程序語言源程序編譯、匯編、鏈接編譯、匯編、鏈接.ii.ii預(yù)處理后的預(yù)處理后的c+c+語言源程序語言源程序編譯、匯編、鏈接編譯、匯編、鏈接.s.s預(yù)處理后的匯編程序預(yù)處理后的匯編程序匯編、鏈接匯編、鏈接.S.S未預(yù)處理的匯編程序未預(yù)處理的匯編程序預(yù)處理、匯編

9、、鏈接預(yù)處理、匯編、鏈接.h.h頭文件頭文件不進(jìn)行任何操作不進(jìn)行任何操作.o.o目標(biāo)文件目標(biāo)文件鏈接鏈接9使用使用gcc編譯代碼編譯代碼p源代碼源代碼示例源程序示例源程序hello.c#include int main(void)printf(hello gcc!rn);return 0;10生成預(yù)處理文件生成預(yù)處理文件p命令命令n$gcc E hello.c o hello.i預(yù)處理文件預(yù)處理文件hello.i的部分內(nèi)容的部分內(nèi)容.extern void funlockfile (FILE *_stream) ;# 679 /usr/include/stdio.h 3# 2 hello.c

10、2int main(void) printf(hello gcc!n); return 0;11生成匯編文件生成匯編文件p命令命令n$gcc S hello.c o hello.s匯編文件匯編文件hello.s的部分內(nèi)容的部分內(nèi)容.main:pushl%ebpmovl%esp, %ebp.addl$16, %espmovl$0, %eaxleaveret.12生成二進(jìn)制文件生成二進(jìn)制文件p生成目標(biāo)文件生成目標(biāo)文件n命令:命令:p$gcc c hello.c o hello.op生成可執(zhí)行文件生成可執(zhí)行文件n命令:命令:p$gcc hello.c o hellop運(yùn)行程序運(yùn)行程序p$./hell

11、ohello gcc!13編譯多個(gè)文件編譯多個(gè)文件p文件清單文件清單greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #include #include greeting.hvoid greeting (char * name)printf(Hello %s!rn,name); my_app.c #include #include greeting.h#define N 10int main(void)char nameN; printf(Your Na

12、me,Please:); scanf(%s,name); greeting(name); return 0; 14編譯多個(gè)文件編譯多個(gè)文件p目錄結(jié)構(gòu)目錄結(jié)構(gòu)(1)n編譯命令編譯命令p$ gcc my_app.c greeting.c o my_appp目錄結(jié)構(gòu)目錄結(jié)構(gòu)(2)n編譯方式編譯方式(1)$gcc my_app.c functions/greeting.c o my_app -I functions greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions15編譯多個(gè)文件編譯多個(gè)文件p目錄結(jié)構(gòu)目錄結(jié)構(gòu)(2

13、)n編譯方式編譯方式(2)p分步編譯分步編譯p命令:命令: 1、$gcc -c my_app.c -I functions 2、$gcc -c functions/greeting.c 3、$gcc my_app.o greeting.o o my_appp思路:思路: 編譯每一個(gè)編譯每一個(gè).c文件,得到文件,得到.o的目標(biāo)文件;的目標(biāo)文件; 將每一個(gè)將每一個(gè).o的目標(biāo)文件鏈接成一個(gè)可執(zhí)行的文件;的目標(biāo)文件鏈接成一個(gè)可執(zhí)行的文件;16使用使用make工具工具p適用場合:適用場合:n多個(gè)文件組成的軟件項(xiàng)目多個(gè)文件組成的軟件項(xiàng)目pMakefile文件基本格式:文件基本格式:p目標(biāo):欲生成的目標(biāo)文件

14、目標(biāo):欲生成的目標(biāo)文件p依賴項(xiàng):生成目標(biāo)需要的文件依賴項(xiàng):生成目標(biāo)需要的文件p原理:原理:n判斷依賴項(xiàng)是否為最新,否則,生成新的目標(biāo)判斷依賴項(xiàng)是否為最新,否則,生成新的目標(biāo)pmake工具的使用格式:工具的使用格式:nmake 命令選項(xiàng)命令選項(xiàng) 命令參數(shù)命令參數(shù)n通常使用通常使用make就可以了,就可以了,make會尋找會尋找Makefile作為編譯指導(dǎo)作為編譯指導(dǎo)文件;文件;目標(biāo):依賴項(xiàng)列表目標(biāo):依賴項(xiàng)列表(Tab縮進(jìn))命令縮進(jìn))命令17使用使用make工具工具pMakefile示例示例Makefile文件文件1my_app:greeting.o my_app.o2gcc my_app.o g

15、reeting.o -o my_app3greeting.o:functions/greeting.c functions/greeting.h4gcc -c functions/greeting.c5my_app.o:my_app.c functions/greeting.h6gcc c my_app.c I functions18使用使用make工具工具p目標(biāo)的依賴關(guān)系目標(biāo)的依賴關(guān)系my_appmy_app.ogreeting.omy_app.cFunctions/greeting.hFunctions/greeting.cgcc c my_app.c I functions gcc -c

16、 functions/greeting.c gcc my_app.o greeting.o -o my_app 19使用使用make工具工具p更實(shí)用的更實(shí)用的Makefile更實(shí)用的更實(shí)用的Makefile文件文件1OBJS = greeting.o my_app.o2CC = gcc3CFLAGS = -Wall -O g4my_app:$OBJS5$CC $OBJS -o my_app6greeting.o:functions/greeting.c functions/greeting.h7$CC $CFLAGS -c functions/greeting.c8my_app.o:my_ap

17、p.c functionsgreeting.h9$CC $CFLAGS -c my_app.c -Ifunctions20調(diào)試調(diào)試p調(diào)試調(diào)試n靜態(tài)調(diào)試:靜態(tài)調(diào)試:p在程序編譯階段查錯并修正錯誤;在程序編譯階段查錯并修正錯誤;p主要為語法錯誤:主要為語法錯誤: 輸入錯誤;輸入錯誤; 類型匹配錯誤;類型匹配錯誤;p排錯方式:排錯方式: 利用錯誤、警告信息,并結(jié)合源文件環(huán)境排錯利用錯誤、警告信息,并結(jié)合源文件環(huán)境排錯n動態(tài)調(diào)試:動態(tài)調(diào)試:p在程序運(yùn)行階段差錯并修正錯誤;在程序運(yùn)行階段差錯并修正錯誤;p主要錯誤類型:主要錯誤類型: 算法錯誤;算法錯誤; 輸入錯誤;輸入錯誤;p排錯方式:排錯方式: 利用

18、調(diào)試工具定位并修正錯誤;利用調(diào)試工具定位并修正錯誤;21調(diào)試舉例調(diào)試舉例p源文件源文件greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #include #include greeting.hvoid greeting (char * name)printf(Hello !rn); my_app.c 1#include 2#include greeting.h3#define N 104int main(void)56char namen; 7print

19、f(Your Name,Please:); 8scanf(%s,name)9greeting(name); 10/*return 0;*/ 11 22靜態(tài)調(diào)試舉例靜態(tài)調(diào)試舉例p分塊編譯分塊編譯ngreeting.cp$gcc -g -Wall -c functions/greeting.c-g:將調(diào)試信息加入到編譯的目標(biāo)文件中:將調(diào)試信息加入到編譯的目標(biāo)文件中 ;-Wall:將編譯過程中的所有級別的警告都打印出來:將編譯過程中的所有級別的警告都打印出來 ;p無錯誤無錯誤nmy_app.cp$gcc -g -Wall -c my_app.c -I functionsp參數(shù)含義同上參數(shù)含義同上p錯

20、誤信息:錯誤信息:23調(diào)試舉例調(diào)試舉例p錯誤信息:錯誤信息:n錯誤記錄格式:錯誤記錄格式:p文件名:行號:錯誤描述文件名:行號:錯誤描述my_app.c: In function main:my_app.c:6: n undeclared (first use in this function)my_app.c:6: (Each undeclared identifier is reported only oncemy_app.c:6: for each function it appears in.)my_app.c:9: parse error before greetingmy_app.

21、c:6: warning: unused variable name24靜態(tài)調(diào)試舉例靜態(tài)調(diào)試舉例p分析、定位錯誤(警告):分析、定位錯誤(警告):nmy_app.c的第的第6行:行:p描述含義:描述含義: n是一個(gè)沒有聲明的變量;是一個(gè)沒有聲明的變量;p分析:分析: 聲明數(shù)字聲明數(shù)字name時(shí)用到了變量時(shí)用到了變量n,但變量,但變量n在之前沒有聲明;在之前沒有聲明;p改正:改正: 聲明一個(gè)新變量聲明一個(gè)新變量n;或者或者 將將n改為宏改為宏Np這里取第這里取第2種改正方法;種改正方法;25靜態(tài)調(diào)試舉例靜態(tài)調(diào)試舉例nmy_app.c的第的第9行:行:p描述含義:描述含義: 在在“greeting

22、”之前出現(xiàn)解析錯誤;之前出現(xiàn)解析錯誤;p分析:分析: c中每行程序以;結(jié)束,第中每行程序以;結(jié)束,第9行行g(shù)reeting之前的程序行沒有以;結(jié)之前的程序行沒有以;結(jié)束;束;p改正:改正: 第第8行末尾增加行末尾增加“;”p重新編譯重新編譯p錯誤信息:錯誤信息:my_app.c: In function main:my_app.c:11: warning: control reaches end of non-void function26靜態(tài)調(diào)試舉例靜態(tài)調(diào)試舉例p分析、定位錯誤(警告):分析、定位錯誤(警告):n警告:警告:my_app.c的的11行行p描述含義:描述含義: 控制以非空函數(shù)結(jié)

23、束;控制以非空函數(shù)結(jié)束;p分析:分析: main函數(shù)返回類型為函數(shù)返回類型為int,源程序沒有以,源程序沒有以return 整數(shù)整數(shù)形式結(jié)束;形式結(jié)束;p改正:改正: 將將main改為返回改為返回void類型;類型;或者:或者: 在在main程序后增加程序后增加return 返回語句;返回語句; 采用第采用第2種解決方式;種解決方式;p重新編譯,無錯誤或警告信息,完成靜態(tài)調(diào)試重新編譯,無錯誤或警告信息,完成靜態(tài)調(diào)試27靜態(tài)調(diào)試舉例靜態(tài)調(diào)試舉例p靜態(tài)調(diào)試總結(jié)靜態(tài)調(diào)試總結(jié)n主要為語法錯誤:主要為語法錯誤:p輸入錯誤;輸入錯誤;p類型匹配錯誤;類型匹配錯誤;n分析信息:分析信息:p主要來自主要來自g

24、cc編譯時(shí)產(chǎn)生的提示信息編譯時(shí)產(chǎn)生的提示信息n錯誤警告定位:錯誤警告定位:p不一定在提示信息描述的地方;不一定在提示信息描述的地方;p綜合分析提示信息及提示行的上下文環(huán)境,定位并修正錯誤、綜合分析提示信息及提示行的上下文環(huán)境,定位并修正錯誤、警告。警告。p有的警告可以不用修復(fù);有的警告可以不用修復(fù);28動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p 常見的動態(tài)調(diào)試方法:常見的動態(tài)調(diào)試方法:n增加調(diào)試語句增加調(diào)試語句 ;n記錄程序的執(zhí)行狀況記錄程序的執(zhí)行狀況 ;n觀察內(nèi)存變化觀察內(nèi)存變化 ;n使用調(diào)試工具;使用調(diào)試工具;pGUN Debuger(gdb)的功能:的功能:n啟動程序,設(shè)置程序執(zhí)行的上下文環(huán)境;啟動程序

25、,設(shè)置程序執(zhí)行的上下文環(huán)境;n在指定的條件下停止程序;在指定的條件下停止程序;n程序停止時(shí),檢查程序的狀態(tài);程序停止時(shí),檢查程序的狀態(tài);n在程序運(yùn)行時(shí),改變程序狀態(tài),使其按照改變后的狀態(tài)在程序運(yùn)行時(shí),改變程序狀態(tài),使其按照改變后的狀態(tài)繼續(xù)執(zhí)行。繼續(xù)執(zhí)行。29動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例gdbgdb常用的調(diào)試命令常用的調(diào)試命令命令命令含義含義file指定需要進(jìn)行調(diào)試的程序step單步(行)執(zhí)行,如果遇到函數(shù)會進(jìn)入函數(shù)內(nèi)部next單步(行)執(zhí)行,如果遇到函數(shù)不會進(jìn)入函數(shù)內(nèi)部run啟動被執(zhí)行的程序quit退出gdb調(diào)試環(huán)境print查看變量或者表達(dá)式的值break設(shè)置斷點(diǎn),程序執(zhí)行到斷點(diǎn)就會暫停起來sh

26、ell執(zhí)行其后的shell命令list查看指定文件或者函數(shù)的源代碼,并標(biāo)出行號30動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p對靜態(tài)調(diào)試中的例子繼續(xù)進(jìn)行動態(tài)調(diào)試對靜態(tài)調(diào)試中的例子繼續(xù)進(jìn)行動態(tài)調(diào)試p工具:工具:gdb,啟動,啟動gdb:$gdbGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it

27、 and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb)啟動命令啟動命令啟動提示啟動提示啟動完畢啟動完畢31動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p調(diào)試指定程序(調(diào)試指定程序(./my_app)n問題:問題:p期望的輸出和實(shí)

28、際輸出不一致期望的輸出和實(shí)際輸出不一致(gdb) file ./my_appReading symbols from ./my_app.done(gdb) runStarting program: /home/tom/shell_script/cpp/my_app/my_appYour Name,Please:tomHello !Program exited normally.(gdb)加載調(diào)試程序加載調(diào)試程序啟動調(diào)試程序啟動調(diào)試程序程序輸出程序輸出提示信息提示信息32動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p初次錯誤定位:初次錯誤定位:n輸出有錯誤輸出有錯誤p錯誤定位錯誤定位n重新開始一次調(diào)試重新開始一次調(diào)

29、試;n啟動啟動gdb;n加載調(diào)試程序(加載調(diào)試程序(./my_app);n查看程序源代碼查看程序源代碼p命令:命令:list 文件名文件名33動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p(gdb) list my_app.c:1,20p1#include p2#include greeting.hp3#define N 10p4int main(void)p5p6char nameN;p7printf(Your Name,Please:);p8scanf(%s,name);p9greeting(name);p10return 0;p11p(gdb) break 7pBreakPoint 1 at 0 x8048

30、384: file my_app.c, line 7.p在程序第在程序第7行設(shè)置斷點(diǎn)行設(shè)置斷點(diǎn)n命令:命令: (gdb) break 7查看源代碼查看源代碼設(shè)置斷點(diǎn)設(shè)置斷點(diǎn)提示信息提示信息34動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p錯誤詳細(xì)定位錯誤詳細(xì)定位1(gdb) run2Starting program: /home/tom/shell_script/cpp/my_app/my_app3Breakpoint 1,main()() at my_app.c:747printf(Your Name,Please:);5(gdb) next68 scanf(%s,name);7(gdb) next8Your

31、Name,Please:tom99 greeting(name);啟動調(diào)試程序啟動調(diào)試程序斷點(diǎn)激活斷點(diǎn)激活步進(jìn)下一步步進(jìn)下一步35動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例10(gdb) print name11$1 = “tom000 00000012(gdb) step13greeting(name=0 xbfffdf20 “tom”)at functions/greeting.c:5145 printf(”Hello !rn”);15(gdb) step16Hello !176 18(gdb) kill19Kill the programe being debugged?(y or n)y20(gdb)

32、quitp錯誤詳細(xì)定位錯誤詳細(xì)定位查看變量值查看變量值進(jìn)入函數(shù)內(nèi)部進(jìn)入函數(shù)內(nèi)部步進(jìn)執(zhí)行步進(jìn)執(zhí)行停止調(diào)試停止調(diào)試退出退出gdb36動態(tài)調(diào)試舉例動態(tài)調(diào)試舉例p分析分析:n11行說明行說明name變量被正確賦值(變量被正確賦值(tom)n13行說明行說明name變量值被正確賦予變量值被正確賦予greeting的參數(shù)變的參數(shù)變量量namen16說明打印出現(xiàn)了錯誤,即錯誤出現(xiàn)在函數(shù)說明打印出現(xiàn)了錯誤,即錯誤出現(xiàn)在函數(shù)greeting中;中;p綜合分析綜合分析n錯誤出現(xiàn)在錯誤出現(xiàn)在greeting.c的第的第5行;行;n原因:原因:p沒有輸出字符串的格式不對;沒有輸出字符串的格式不對;p改正錯誤改正錯誤3

33、7動態(tài)調(diào)試總結(jié)動態(tài)調(diào)試總結(jié)p動態(tài)調(diào)試總結(jié)動態(tài)調(diào)試總結(jié)n主要錯誤類型:主要錯誤類型:p算法錯誤;算法錯誤;p輸入錯誤;輸入錯誤;n定位方法:定位方法:p設(shè)置斷點(diǎn);設(shè)置斷點(diǎn);p單步步進(jìn)執(zhí)行;單步步進(jìn)執(zhí)行;p查看變量取值變化;查看變量取值變化;p反復(fù)執(zhí)行,逐步縮小錯誤范圍;反復(fù)執(zhí)行,逐步縮小錯誤范圍;38使用使用automake和和autoconf產(chǎn)生產(chǎn)生Makefile在開始使用在開始使用automakeautomake和和autoconfautoconf之前,請先確認(rèn)系統(tǒng)之前,請先確認(rèn)系統(tǒng)已經(jīng)安裝以下的軟件:已經(jīng)安裝以下的軟件: automakeautomake:是一個(gè)從是一個(gè)從Makefile

34、.am文件自動生成文件自動生成Makefile.in的工具。為了生成的工具。為了生成Makefile.in,automake還需用到還需用到perl 。 autoconf:autoconf:是一個(gè)用于生成可以自動地配置軟件源碼包,是一個(gè)用于生成可以自動地配置軟件源碼包,用以適應(yīng)多種用以適應(yīng)多種UNIX類系統(tǒng)的類系統(tǒng)的shell腳本工具,其中腳本工具,其中autoconf需要用到需要用到 m4,便于生成腳本。,便于生成腳本。 GNU m4GNU m4 PerlPerl GNU Libtool (GNU Libtool (非必須,如果你需要產(chǎn)生非必須,如果你需要產(chǎn)生 shared shared l

35、ibrary) library) ;39使用使用Automake和和Autoconf產(chǎn)生產(chǎn)生Makefile實(shí)例:下面用hello.c 來作為例子進(jìn)行說明在工作目錄下建立一個(gè)新的子目錄devel,再在devel下建立一個(gè)hello的子目錄,這個(gè)目錄將作為存放 hello 這個(gè)程序及其相關(guān)文件的地方:用編輯器寫個(gè)hello.c文件:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;40使用使用automake和和autoconf產(chǎn)生產(chǎn)生Makefile接下來就要使用 autoconf 及 automake

36、 來產(chǎn)生Makefile文件,步驟如下:(1)用autoscan 產(chǎn)生一個(gè)configure.in的模板。執(zhí)行 autoscan 后會產(chǎn)生一個(gè)configure.scan 的文件,可以用它做為configure.in文件的模板: autoscan是用來掃描源代碼目錄生成 configure.scan文件的。autoscan可以用目錄名做為參數(shù),但如果你不使用參數(shù)的話,那么autoscan將認(rèn)為使用的是當(dāng)前目錄。 autoscan將掃描你所指定目錄中的源文件,并創(chuàng)建configure.scan文件。 (2)編輯configure.scan文件,并且把文件名改成configure.in 41使用使

37、用automake和和autoconf產(chǎn)生產(chǎn)生Makefilepconfigure.in文件的內(nèi)容是一些宏,這些宏經(jīng) 過autoconf 處理后會變成檢查系統(tǒng)特性、環(huán)境變量、軟件必須的參數(shù)的shell腳本。configure.in文件中的宏的順序并沒有規(guī)定,但是你必須在所有宏的最前面和最后面分別加上AC_INIT宏和AC_OUTPUT宏。Configure.scan文件格式:# Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT(FILE)AM_INIT_AUTOMAKE(

38、FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR(config.h.in) AC_CONFIG_HEADER(config.h) # Checks for programs. AC_PROG_CC # Checks for libraries. # FIXME: Replace main with a function in -lpthread: AC_CHECK_LIB(pthread, main) # Checks for header files. Checks for typedefs, structure

39、s, and compiler characteristics. # Checks for library functions. AC_OUTPUT (FILE)這個(gè)宏用來檢查源代碼所在的路這個(gè)宏用來檢查源代碼所在的路徑。徑。這個(gè)宏是必須的,它描述了我們這個(gè)宏是必須的,它描述了我們將要生成的軟件包的名字及其版將要生成的軟件包的名字及其版本號本號.這個(gè)宏將檢查系統(tǒng)這個(gè)宏將檢查系統(tǒng)所用的所用的C編譯器。編譯器。我們要輸出的我們要輸出的Makefile的名字。的名字。本例中的Configure.scan文件內(nèi)容:# -*- Autoconf -*-# Process this file with a

40、utoconf to produce a configure script.AC_INIT(hello,1.0)AM_INIT_AUTOMAKE# Checks for programs.AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT(Makefile) 44使用使用automake和和autoconf產(chǎn)生產(chǎn)生Makefile(3)執(zhí)行aclocal和autoconf ,分別會產(chǎn)生

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論