課件1第12章gcc的使用與開發(fā)_第1頁
課件1第12章gcc的使用與開發(fā)_第2頁
課件1第12章gcc的使用與開發(fā)_第3頁
課件1第12章gcc的使用與開發(fā)_第4頁
課件1第12章gcc的使用與開發(fā)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

2023年4月13日第12章GCC的使用

與開發(fā)2023年4月13日主要內(nèi)容gcc簡介功能命令利用gcc編譯c程序利用make工具簡化編譯過程make簡介Makefile基本格式調(diào)試靜態(tài)調(diào)試動態(tài)調(diào)試gdb調(diào)試工具的使用2023年4月13日gcc簡介名稱:GNUprojectC

andC++CompilerGNUCompilerCollection管理與維護GNU項目對C/C++編譯的控制預(yù)處理(Preprocessing)編譯(Compilation)匯編(Assembly)鏈接(Linking2023年4月13日gcc的使用基本使用格式$gcc[選項]<文件名>常用選項及含義gcc常用選項選項含義-ofile將經(jīng)過gcc處理過的結(jié)果存為文件file,這個結(jié)果文件可能是預(yù)處理文件、匯編文件、目標文件或者最終的可執(zhí)行文件。假設(shè)被處理的源文件為source.suffix,如果這個選項被省略了,那么生成的可執(zhí)行文件默認名稱為a.out;目標文件默認名為source.o;匯編文件默認名為source.s;生成的預(yù)處理文件則發(fā)送到標準輸出設(shè)備。2023年4月13日gcc的常用選項gcc常用選項選項含義-c僅對源文件進行編譯,不鏈接生成可執(zhí)行文件。在對源文件進行查錯時,或只需產(chǎn)生目標文件時可以使用該選項。-g[gdb]在可執(zhí)行文件中加入調(diào)試信息,方便進行程序的調(diào)試。如果使用中括號中的選項,表示加入gdb擴展的調(diào)試信息,方便使用gdb來進行調(diào)試-O[0、1、2、3]對生成的代碼使用優(yōu)化,中括號中的部分為優(yōu)化級別,缺省的情況為2級優(yōu)化,0為不進行優(yōu)化。注意,采用更高級的優(yōu)化并不一定得到效率更高的代碼。-Dname[=definition]將名為name的宏定義為definition,如果中括號中的部分缺省,則宏被定義為12023年4月13日gcc的常用選項gcc常用選項選項含義-Idir在編譯源程序時增加一個搜索頭文件的額外目錄——dir,即include增加一個搜索的額外目錄。-Ldir在編譯源文件時增加一個搜索庫文件的額外目錄——dir-llibrary在編譯鏈接文件時增加一個額外的庫,庫名為library.a-w禁止所有警告-Wwarning允許產(chǎn)生warning類型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示產(chǎn)生所有警告。如果warning取值為error,其含義是將所有警告作為錯誤(error),即出現(xiàn)警告就停止編譯。2023年4月13日gcc文件擴展名規(guī)范gcc可以根據(jù)文件擴展名執(zhí)行操作gcc文件擴展名規(guī)范擴展名類型可進行的操作方式.cc語言源程序預(yù)處理、編譯、匯編、鏈接.C,.cc,.cp,.cpp,.c++,.cxxc++語言源程序預(yù)處理、編譯、匯編、鏈接.i預(yù)處理后的c語言源程序編譯、匯編、鏈接.ii預(yù)處理后的c++語言源程序編譯、匯編、鏈接.s預(yù)處理后的匯編程序匯編、鏈接.S未預(yù)處理的匯編程序預(yù)處理、匯編、鏈接.h頭文件不進行任何操作.o目標文件鏈接2023年4月13日使用gcc編譯代碼源代碼示例源程序——hello.c#include<stdio.h>intmain(void){ printf("hellogcc!\r\n"); return0;}2023年4月13日生成預(yù)處理文件命令$gcc–Ehello.c–ohello.i預(yù)處理文件hello.i的部分內(nèi)容......externvoidfunlockfile(FILE*__stream);#679"/usr/include/stdio.h"3#2"hello.c"2intmain(void){printf("hellogcc!\n");return0;}2023年4月13日生成匯編文件命令$gcc–Shello.c–ohello.s匯編文件hello.s的部分內(nèi)容......main: pushl %ebp movl %esp,%ebp........ addl $16,%esp movl $0,%eax leave ret......"2023年4月13日編譯多個文件文件清單greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello%s!\r\n",name);}my_app.c#include<stdio.h>#include"greeting.h"#defineN10intmain(void){charname[N];printf("YourName,Please:");scanf("%s",name);greeting(name);return0;}2023年4月13日生成二進制文件生成目標文件命令:$gcc–chello.c–ohello.o生成可執(zhí)行文件命令:$gcchello.c–ohello運行程序$./hello

hellogcc!2023年4月13日編譯多個文件目錄結(jié)構(gòu)(1)編譯命令$gccmy_app.cgreeting.c–omy_app目錄結(jié)構(gòu)(2)編譯方式(1)$ gccmy_app.cfunctions/greeting.c–omy_app-Ifunction

greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions2023年4月13日編譯多個文件目錄結(jié)構(gòu)(2)編譯方式(2)分步編譯命令:1、$gcc-cmy_app.c-Ifunctions2、$gcc-cfunctions/greeting.c3、$gccmy_app.ogreeting.o–omy_app思路:編譯每一個.c文件,得到.o的目標文件;將每一個.o的目標文件鏈接成一個可執(zhí)行的文件;2023年4月13日使用make工具適用場合:多個文件組成的軟件項目基本格式:目標:欲生成的目標文件依賴項:生成目標需要的文件原理:判斷依賴項是否為最新,否則,生成新的目標make工具的使用格式:make[[命令選項][命令參數(shù)]]通常使用make就可以了,make會尋找Makefile作為編譯指導(dǎo)文件;目標:依賴項列表(Tab縮進)命令2023年4月13日使用make工具Makefile示例Makefile文件1my_app:greeting.omy_app.o2 gccmy_app.ogreeting.o-omy_app3greeting.o:functions\greeting.cfunctions\greeting.h4 gcc-cfunctions\greeting.c5my_app.o:my_app.cfunctions\greeting.h6 gcc–cmy_app.c–Ifunctions2023年4月13日使用make工具目標的依賴關(guān)系my_appmy_app.ogreeting.omy_app.cfunctions\greeting.hfunctions\greeting.cgcc–cmy_app.c–Ifunctionsgcc-cfunctions\greeting.cgccmy_app.ogreeting.o-omy_app2023年4月13日使用make工具更實用的Makefile更實用的Makefile文件1OBJS=greeting.omy_app.o2CC=gcc3CFLAGS=-Wall-O–g4my_app:${OBJS}5 ${CC}${OBJS}-omy_app6greeting.o:functions\greeting.cfunctions\greeting.h7 ${CC}${CFLAGS}-cfunctions\greeting.c8my_app.o:my_app.cfunctions\greeting.h9 ${CC}${CFLAGS}-cmy_app.c-Ifunctions2023年4月13日調(diào)試調(diào)試靜態(tài)調(diào)試:在程序編譯階段查錯并修正錯誤;主要為語法錯誤:輸入錯誤;類型匹配錯誤;排錯方式:利用錯誤、警告信息,并結(jié)合源文件環(huán)境排錯動態(tài)調(diào)試:在程序運行階段差錯并修正錯誤;主要錯誤類型:算法錯誤;輸入錯誤;排錯方式:利用調(diào)試工具定位并修正錯誤;2023年4月13日調(diào)試舉例源文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#include<stdio.h>#include"greeting.h"voidgreeting(char*name){printf("Hello!\r\n");}my_app.c1#include<stdio.h>2#include"greeting.h"3#defineN104intmain(void)5{6charname[n];7printf("YourName,Please:");8scanf("%s",name)9greeting(name);10/*return0;*/11}2023年4月13日靜態(tài)調(diào)試舉例分塊編譯greeting.c$gcc

-g-Wall

-cfunctions/greeting.c-g:將調(diào)試信息加入到編譯的目標文件中;-Wall:將編譯過程中的所有級別的警告都打印出來;無錯誤my_app.c$gcc-g-Wall-cmy_app.c-Ifunctions參數(shù)含義同上錯誤信息:

2023年4月13日調(diào)試舉例錯誤信息:錯誤記錄格式:文件名:行好:錯誤描述my_app.c:在函數(shù)’main’中:my_app.c:6:12:錯誤:‘n’未聲明(在此函數(shù)內(nèi)第一次使用)my_app.c:6:12:附注:每個未聲明的標示符在其出現(xiàn)的函數(shù)內(nèi)只報告一次my_app.c:6:7:警告:未使用的變量’name’[-Wunused-variable]my_app.c:11:1警告:在有返回值的函數(shù)中,控制流程到達函數(shù)尾[-Wreturn-type]2023年4月13日靜態(tài)調(diào)試舉例分析、定位錯誤(警告):my_app.c的第6行:描述含義:n是一個沒有聲明的變量;分析:聲明數(shù)字name時用到了變量n,但變量n在之前沒有聲明;改正:聲明一個新變量n;或者將n改為宏N這里取第2種改正方法;2023年4月13日靜態(tài)調(diào)試舉例my_app.c的第9行:描述含義:在“greeting”之前出現(xiàn)解析錯誤;分析:c中每行程序以;結(jié)束,第9行g(shù)reeting之前的程序行沒有以;結(jié)束;改正:第8行末尾增加“;”重新編譯錯誤信息:my_app.c:11:1警告:在有返回值的函數(shù)中,控制流程到達函數(shù)尾[-Wreturn-type]2023年4月13日靜態(tài)調(diào)試舉例分析、定位錯誤(警告):警告:my_app.c的11行描述含義:控制以非空函數(shù)結(jié)束;分析:main函數(shù)返回類型為int,源程序沒有以return整數(shù)形式結(jié)束;改正:將main改為返回void類型;或者:在main程序后增加return返回語句;采用第2種解決方式;重新編譯,無錯誤或警告信息,完成靜態(tài)調(diào)試2023年4月13日靜態(tài)調(diào)試舉例靜態(tài)調(diào)試總結(jié)主要為語法錯誤:輸入錯誤;類型匹配錯誤;分析信息:主要來自gcc編譯時產(chǎn)生的提示信息錯誤警告定位:不一定在提示信息描述的地方;綜合分析提示信息及提示行的上下文環(huán)境,定位并修正錯誤、警告。有的警告可以不用修復(fù);2023年4月13日動態(tài)調(diào)試舉例

常見的動態(tài)調(diào)試方法:增加調(diào)試語句;記錄程序的執(zhí)行狀況;觀察內(nèi)存變化;使用調(diào)試工具;GUNDebuger的功能:啟動程序,設(shè)置程序執(zhí)行的上下文環(huán)境;在指定的條件下停止程序;程序停止時,檢查程序的狀態(tài);在程序運行時,改變程序狀態(tài),使其按照改變后的狀態(tài)繼續(xù)執(zhí)行。2023年4月13日動態(tài)調(diào)試舉例gdb常用的調(diào)試命令命令含義file指定需要進行調(diào)試的程序step單步(行)執(zhí)行,如果遇到函數(shù)會進入函數(shù)內(nèi)部next單步(行)執(zhí)行,如果遇到函數(shù)不會進入函數(shù)內(nèi)部run啟動被執(zhí)行的程序quit退出gdb調(diào)試環(huán)境print查看變量或者表達式的值break設(shè)置斷點,程序執(zhí)行到斷點就會暫停起來shell執(zhí)行其后的shell命令list查看指定文件或者函數(shù)的源代碼,并標出行號2023年4月13日動態(tài)調(diào)試舉例對靜態(tài)調(diào)試中的例子繼續(xù)進行動態(tài)調(diào)試工具:gdb啟動gdb$gdb GNUgdb(GDB)Fedora7.8.2-38.fc21Copyright(C)2014FreeSoftwareFoundation,Inc.LicenseGPLv3+:GNUGPLversion3orlater……Forhelp,type"help".Type"aproposword"tosearchforcommandsrelatedto"word".(gdb)啟動命令啟動提示啟動完畢2023年4月13日動態(tài)調(diào)試舉例調(diào)試指定程序(./my_app)問題:期望的輸出和實際輸出不一致(gdb)file./my_app Readingsymbolsfrom./my_app...done(gdb)runStartingprogram:/home/tom/shell_script/cpp/my_app/my_appYourName,Please:tomHello![Inferior1(process4074)exitednormally].(gdb)加載調(diào)試程序啟動調(diào)試程序程序輸出提示信息2023年4月13日動態(tài)調(diào)試舉例初次錯誤定位:輸出有錯誤錯誤定位重新開始一次調(diào)試;啟動gdb;加載調(diào)試程序(./my_app);查看程序源代碼命令:list文件名2023年4月13日動態(tài)調(diào)試舉例(gdb)listmy_app.c:1,201 #include<stdio.h>2 #include"greeting.h"3 #defineN104 intmain(void)5 {6 charname[N];7 printf("YourName,Please:");8 scanf("%s",name);9 greeting(name);10 return0;11 }(gdb)break7BreakPoint1at0x8048384: filemy_app.c,line7.在程序第7行設(shè)置斷點命令:(gdb)break7查看源代碼設(shè)置斷點提示信息2023年4月13日動態(tài)調(diào)試舉例錯誤詳細定位1(gdb)run2Startingprogram:/home/tom/shell_script/cpp/my_app/my_app3Breakpoint1,main()atmy_app.c:747 printf("YourName,Please:");5(gdb)next68scanf("%s",name);7(gdb)next8YourName,Please:tom99greeting(name);啟動調(diào)

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論