




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第一章嵌入式LinuxC語言開發(fā)工具嵌入式Linux-C語言程序設(shè)計(jì)基礎(chǔ)教程第1章-課件本章的要求了解C語言產(chǎn)生的歷史背景熟悉嵌入式Linux下C語言的開發(fā)環(huán)境熟練使用嵌入式Linux下的編輯器vi熟悉嵌入式Linux下的編譯器GCC熟悉嵌入式Linux下的調(diào)試器GDB熟悉嵌入式Linux下的工程管理器make了解eclipse集成開發(fā)環(huán)境
本章的要求了解C語言產(chǎn)生的歷史背景1.1嵌入式LINUX下C語言概述1.1嵌入式LINUX下C語言概述C語言C語言最早是由貝爾實(shí)驗(yàn)室的DennisRitchie為了UNIX的輔助開發(fā)而編寫的,它是在B語言的基礎(chǔ)上開發(fā)出來的。盡管C語言不是專門針對(duì)UNIX操作系統(tǒng)或機(jī)器編寫的,但它與UNIX系統(tǒng)的關(guān)系十分緊密。由于它的硬件無關(guān)性和可移植性,使C語言逐漸成為世界上使用最廣泛計(jì)算機(jī)語言。為了進(jìn)一步規(guī)范C語言的硬件無關(guān)性,1987年,美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)根據(jù)C語言問世以來各種版本對(duì)C語言的發(fā)展和擴(kuò)充,制定了新的標(biāo)準(zhǔn),稱為ANSIC。ANSIC語言比原來的標(biāo)準(zhǔn)C語言有了很大的發(fā)展。目前流行的C語言編譯系統(tǒng)都是以它為基礎(chǔ)的。C語言C語言最早是由貝爾實(shí)驗(yàn)室的DennisRitchieC語言的特點(diǎn)C語言的成功并不是偶然的,它強(qiáng)大的功能和它的可移植性讓它能在各種硬件平臺(tái)上游刃自如。總體而言,C語言有如下特點(diǎn)。
C語言是“中級(jí)語言”。它把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。C語言可以像匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元。
C語言是結(jié)構(gòu)化的語言。C語言采用代碼及數(shù)據(jù)分隔,使程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?,便于使用、維護(hù)以及調(diào)試。C語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便地調(diào)用,并具有多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。
C語言功能齊全。C語言具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外,C語言也具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器,而且計(jì)算功能、邏輯判斷功能也比較強(qiáng)大,可以實(shí)現(xiàn)決策目的。
C語言可移植性強(qiáng)。C語言適合多種操作系統(tǒng),如DOS、Windows、Linux,也適合多種體系結(jié)構(gòu),因此尤其適合在嵌入式領(lǐng)域的開發(fā)。C語言的特點(diǎn)C語言的成功并不是偶然的,它強(qiáng)大的功能和它的可移1.2嵌入式LINUX編輯器VI的使用1.2嵌入式LINUX編輯器VI的使用編輯器Linux中最常用的編輯器有vi(vim)和emacs編輯器Linux中最常用的編輯器有vi(vim)和emacsvi:命令-輸入-底行模式命令模式底行模式輸入模式vi:命令-輸入-底行模式命令模式底行模式輸入模式vi用法---編輯新增(append)
--a
從光標(biāo)所在位置後面開始新增資料,光標(biāo)後的資料隨新增資料向後移動(dòng)。
--A
從光標(biāo)所在列最後面的地方開始新增資料。插入(insert)
--i從光標(biāo)所在位置前面開始插入資料,光標(biāo)後的資料隨新增資料向後移動(dòng)。
--I從光標(biāo)列的第一個(gè)非空白字符前面開始插入資料。開始(open)
--o
在光標(biāo)所在列下新增一列并進(jìn)入輸入模式。
--O
在光標(biāo)所在列上方新增一列并進(jìn)入輸入模式。vi用法---編輯新增(append)
--a從vi用法---修改和刪除x
刪除光標(biāo)所在字符。dd
刪除光標(biāo)所在的列。r修改光標(biāo)所在字符,r後接著要修正的字符R進(jìn)入取代狀態(tài),新增資料會(huì)覆改原先資料,直到按[ESC]回到指令模式下為止。s
刪除光標(biāo)所在字符,并進(jìn)入輸入模式。S
刪除光標(biāo)所在的列,并進(jìn)入輸入模式。vi用法---修改和刪除x刪除光標(biāo)所在字符。vi用法---退出<:q>不保存退出<:q!>不保存強(qiáng)制性退出<:w>保存編輯<:wfilename>存入文件filename中<:w!filename>強(qiáng)制性存入文件filename中<:wq>(<:x>)保存并退出(shift+zz)vi用法---退出<:q>不保存退出vi用法---光標(biāo)移動(dòng)<b>移動(dòng)到當(dāng)前單詞的開始<e>移動(dòng)到當(dāng)前單詞的結(jié)尾<w>向前移動(dòng)一個(gè)單詞<h>向前移動(dòng)一個(gè)字符<j>向上移動(dòng)一行<k>向下移動(dòng)一行<l>向后移動(dòng)一個(gè)字符vi用法---光標(biāo)移動(dòng)<b>移動(dòng)到當(dāng)前單詞的開始vi用法---替換操作<r>替換光標(biāo)所在的字符<R>替換字符序列<cw>替換一個(gè)單詞<ce>同<cw><cb>替換光標(biāo)所在的前一字符<c$>替換自光標(biāo)位置至行尾的所有字符<C>同<c$><cc>替換當(dāng)前行vi用法---替換操作<r>替換光標(biāo)所在的字符vi用法---復(fù)制與粘貼</yw>將光標(biāo)所在單詞拷入剪貼板<y$>將光標(biāo)至行尾的字符拷入剪貼板<Y>同<y$><yy>將當(dāng)前行拷入剪貼板<p>將剪貼板中的內(nèi)容粘貼在光標(biāo)后<P>將剪貼板中的內(nèi)容粘貼在光標(biāo)前vi用法---復(fù)制與粘貼</yw>將光標(biāo)所在單詞拷入剪貼1.3嵌入式LINUX編譯器GCC的使用1.3嵌入式LINUX編譯器GCC的使用gcc編譯器GNUCC(簡稱為gcc)是GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能強(qiáng)大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc又是一個(gè)交叉平臺(tái)編譯器,它能夠在當(dāng)前CPU平臺(tái)上為多種不同體系結(jié)構(gòu)的硬件平臺(tái)開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。gcc編譯器GNUCC(簡稱為gcc)是GNU項(xiàng)目中符合gcc編譯過程gcc編譯過程gcc所支持后綴名解釋gcc所支持后綴名解釋gcc---預(yù)處理階段在該階段,對(duì)包含的頭文件(#include)和宏定義(#define、#ifdef等)進(jìn)行處理??梢允褂胓cc的選項(xiàng)“-E”
讓gcc在預(yù)處理結(jié)束后停止編譯過程。
[root@localhostgcc]#gcc–Ehello.c–ohello.i/*hello.i*/……typedefint(*__gconv_trans_fct)(struct__gconv_step*,struct__gconv_step_data*,void*,__constunsignedchar*,__constunsignedchar**,__constunsignedchar*,unsignedchar**,size_t*);……#2"hello.c"2intmain(){ printf("Hello!Thisisourembeddedworld!\n"); return0;}gcc---預(yù)處理階段在該階段,對(duì)包含的頭文件(#incgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個(gè)階段中,gcc首先要檢查代碼的規(guī)范性、是否有語法錯(cuò)誤等,以確定代碼的實(shí)際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項(xiàng)來進(jìn)行查看,該選項(xiàng)只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。[root@localhostgcc]#gcc–Shello.i–ohello.sgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個(gè)階gcc---編譯階段(2)/*hello.s*/.file "hello.c".section .rodata.align4.LC0:.string "Hello!Thisisourembeddedworld!".text.globlmain.typemain,@functionmain:pushl%ebpmovl%esp,%ebpsubl$8,%espandl$-16,%espmovl$0,%eax
addl$15,%eaxaddl$15,%eaxshrl$4,%eaxsall$4,%eaxsubl%eax,%espsubl$12,%esppushl$.LC0callputsaddl$16,%espmovl$0,%eaxleaveret.size main,.-main.ident "GCC:(GNU)4.0.0200X0Y19(RedHat4.0.0-8)".section .note.GNU-stack,"",@progbitsgcc---編譯階段(2)/*hello.s*/gcc---常用選項(xiàng)[root@localhostgcc]gcchello1.c–I/root/workplace/gcc/-ohello1gcc---常用選項(xiàng)[root@localhostgcgcc---庫選項(xiàng)函數(shù)庫分為靜態(tài)庫和動(dòng)態(tài)庫兩種,靜態(tài)庫是一系列的目標(biāo)文件(.o文件)的歸檔文件(文件名格式為libname.a),如果在編譯某個(gè)程序時(shí)鏈接靜態(tài)庫,則鏈接器將會(huì)搜索靜態(tài)庫,從中提取出它所需要的目標(biāo)文件并直接拷貝到該程序的可執(zhí)行二進(jìn)制文件(ELF格式文件)之中;動(dòng)態(tài)庫(文件名格式為libname.so[.主版本號(hào).次版本號(hào).發(fā)行號(hào)])在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入。gcc---庫選項(xiàng)函數(shù)庫分為靜態(tài)庫和動(dòng)態(tài)庫兩種,靜態(tài)庫是Linux函數(shù)庫的創(chuàng)建與使用(1)/*unsgn_pow.c:庫程序*/unsignedlonglongunsgn_pow(unsignedintx,unsignedinty){
unsignedlonglongres=1;
if(y==0){res=1;}elseif(y==1){res=x;
}else{res=x*unsgn_pow(x,y-1);
}returnres;}/*pow_test.c*/#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){unsignedintx,y;unsignedlonglongres;if((argc<3)||(sscanf(argv[1],"%u",&x)!=1)||(sscanf(argv[2],"%u",&y))!=1)
{printf("Usage:powbaseexponent\n");exit(1);}res=unsgn_pow(x,y);printf("%u^%u=%u\n",x,y,res);exit(0);}Linux函數(shù)庫的創(chuàng)建與使用(1)/*unsgn_pow.靜態(tài)庫$gcc-cunsgn_pow.c
$arrcsvlibpow.aunsgn_pow.o a-unsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow$./pow_test210 2^10=1024
靜態(tài)庫$gcc-cunsgn_pow.c動(dòng)態(tài)庫$gcc-fPIC-Wall-cunsgn_pow.c$gcc-shared-olibpow.sounsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow
在運(yùn)行可執(zhí)行程序之前,需要注冊(cè)動(dòng)態(tài)庫的路徑名。其方法有幾種:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH環(huán)境變量,或者將庫文件直接拷貝到/lib或者/usr/lib目錄下(這兩個(gè)目錄為系統(tǒng)的默認(rèn)的庫路徑名)。$cplibpow.so/lib$./pow_test210 2^10=1024
動(dòng)態(tài)庫$gcc-fPIC-Wall-cun靜態(tài)庫與動(dòng)態(tài)庫的比較動(dòng)態(tài)庫只有在使用它的程序執(zhí)行時(shí)才被鏈接使用,而不是將需要的部分直接編譯入可執(zhí)行文件中,并且一個(gè)動(dòng)態(tài)庫可以被多個(gè)程序使用故可稱為共享庫,而靜態(tài)庫將會(huì)整合到程序中,因此在程序執(zhí)行時(shí)不用加載靜態(tài)庫。從而可知,鏈接到靜態(tài)庫會(huì)使你的程序臃腫,并且難以升級(jí),但是可能會(huì)比較容易部署。而鏈接到動(dòng)態(tài)庫會(huì)使你的程序輕便,并且易于升級(jí),但是會(huì)難以部署。靜態(tài)庫與動(dòng)態(tài)庫的比較動(dòng)態(tài)庫只有在使用它的程序執(zhí)行時(shí)才被鏈接使gcc---警告選項(xiàng)(1)$gcc–ansiwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”
gcc---警告選項(xiàng)(1)$gcc–ansiwargcc---警告選項(xiàng)(2)$gcc–pedanticwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:5警告:ISOC90不支持“l(fā)onglong”warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”
$gcc–Wallwarning.c–owarningwarning.c:4警告:“main”的返回類型不是“int”warning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:5警告:未使用的變量“tmp”
gcc---警告選項(xiàng)(2)$gcc–pedanticgcc---優(yōu)化選項(xiàng)gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過編譯選項(xiàng)“-On”來控制優(yōu)化代碼的生成,其中n是一個(gè)代表優(yōu)化級(jí)別的整數(shù)。不同的優(yōu)化級(jí)別對(duì)應(yīng)不同的優(yōu)化處理工作。如使用優(yōu)化選項(xiàng)“-O”主要進(jìn)行線程跳轉(zhuǎn)(ThreadJump)和延遲退棧(DeferredStackPops)兩種優(yōu)化。使用優(yōu)化選項(xiàng)“-O2”除了完成所有“-O1”級(jí)別的優(yōu)化之外,同時(shí)還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項(xiàng)“-O3”則還包括循環(huán)展開和其他一些與處理器特性相關(guān)的優(yōu)化工作??赡苓m合使用優(yōu)化選項(xiàng)的場(chǎng)合:程序發(fā)行不太適合使用優(yōu)化選項(xiàng)的場(chǎng)合:程序開發(fā)gcc---優(yōu)化選項(xiàng)gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過編譯gcc---體系結(jié)構(gòu)相關(guān)選項(xiàng)gcc---體系結(jié)構(gòu)相關(guān)選項(xiàng)1.4嵌入式LINUX調(diào)試器GDB的使用1.4嵌入式LINUX調(diào)試器GDB的使用gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的VC工具等媲美。$gcc-gtest.c-otest$gdbtestGNUgdbRedHatLinux(-1.21rh)Copyright2004FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails.ThisGDBwasconfiguredas"i386-redhat-linux-gnu"...Usinghostlibthread_dblibrary"/lib/libthread_db.so.1".(gdb)gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的gdb使用方法(2)(gdb)b6Breakpoint1at0x804846d:filetest.c,line6.(gdb)l1#include<stdio.h>2intsum(intm);3intmain()4{5inti,n=0;6sum(50);7for(i=1;i<=50;i++)8{9 n+=i;10}(gdb)l11printf("Thesumof1~50is%d\n",n);1213}14intsum(intm)15{16inti,n=0;17for(i=1;i<=m;i++)18{19 n+=i;20}21printf("Thesumof1~mis=%d\n",n);20}(gdb)b19(gdb)cBreakpoin2,sum(m=50)attest.c:1919 printf(“Thesumof1-mis%d\n”,n);(gdb)bt#0 sum(m=50)attest.c:19#1 0x080483e8inmain()attest.c:6(gdb)infobNumTypeDispEnbAddressWhat1breakpointkeepy0x0804846dinmainattest.c:6(gdb)rStartingprogram:/root/workplace/gdb/testReadingsymbolsfromsharedobjectreadfromtargetmemory...done.LoadedsystemsuppliedDSOat0x5fb000Breakpoint1,main()attest.c:66sum(50);gdb使用方法(2)(gdb)b6(gdb)l(gdbgdb使用方法(3)(gdb)pn$1=0(gdb)pi$2=134518440(gdb)nThesumof1-mis12757for(i=1;i<=50;i++)(gdb)ssum(m=50)attest.c:1616inti,n=0;(gdb)cContinuing.Thesumof1-50is:1275Programexitedwithcode031.(gdb)helpListofclassesofcommands:aliases--Aliasesofothercommandsbreakpoints--Makingprogramstopatcertainpointsdata--Examiningdatafiles--Specifyingandexaminingfilesinternals--Maintenancecommands…Type"help"followedbyaclassnameforalistofcommandsinthatclass.Type"help"followedbycommandnameforfulldocumentation.Commandnameabbreviationsareallowedifunambiguous.(gdb)helpcallCallafunctionintheprogram.Theargumentisthefunctionnameandarguments,inthenotationofthecurrentworkinglanguage.Theresultisprintedandsavedinthevaluehistory,ifitisnotvoid.gdb使用方法(3)(gdb)pn(gdb)n(gdbgdb工作環(huán)境相關(guān)命令gdb工作環(huán)境相關(guān)命令gdb設(shè)置斷點(diǎn)與恢復(fù)命令gdb設(shè)置斷點(diǎn)與恢復(fù)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中查看運(yùn)行數(shù)據(jù)的相關(guān)命令gdb中查看運(yùn)行數(shù)據(jù)的相關(guān)命令1.5MAKE工程管理器1.5MAKE工程管理器make工程管理器工程管理器,顧名思義,是指管理較多的文件Make工程管理器也就是個(gè)“自動(dòng)編譯管理器”,這里的“自動(dòng)”是指它能構(gòu)根據(jù)文件時(shí)間戳自動(dòng)發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時(shí),它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作make工程管理器工程管理器,顧名思義,是指管理較多的文件makefile基本結(jié)構(gòu)(1)makefile是make讀入的惟一配置文件,因此本節(jié)的內(nèi)容實(shí)際就是講述makefile的編寫規(guī)則。在一個(gè)makefile中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件;要?jiǎng)?chuàng)建的目標(biāo)體所依賴的文件(dependency_file);創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command),這一行必須以制表符(tab鍵)開頭。makefile基本結(jié)構(gòu)(1)makefile是make讀入makefile基本結(jié)構(gòu)(2)makefile格式例子使用makefile
target:dependency_files<TAB >command/*該行必須以tab鍵開頭*/hello.o:hello.chello.h
gcc–chello.c–ohello.o$makehello.ogcc–chello.c–ohello.o$lshello.chello.hhello.omakefilemakefile基本結(jié)構(gòu)(2)makefile格式targe創(chuàng)建和使用makefile變量用來代替一個(gè)文本字符串變量定義的兩種方式遞歸展開方式VAR=var簡單方式VAR:=var變量使用$(VAR)OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)$(CC)$(OBJS)-odavidkang.o:kang.ckang.h
$(CC)$(CFLAGS)-ckang.c-okang.oyul.o:yul.cyul.h$(CC)$(CFLAGS)-cyul.c-oyul.o創(chuàng)建和使用makefile變量用來代替一個(gè)文本字符串OBJmakefile變量變量種類用戶自定義變量預(yù)定義變量自動(dòng)變量環(huán)境變量OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@kang.o:kang.ckang.h$(CC)$(CFLAGS)-c$<-o$@yul.o:yul.cyul.h
$(CC)$(CFLAGS)-c$<-o$@makefile變量變量種類OBJS=kang.oyumakefile中常用的預(yù)定義變量makefile中常用的預(yù)定義變量makefile中常見的自動(dòng)變量和環(huán)境變量make在啟動(dòng)時(shí)會(huì)自動(dòng)讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會(huì)創(chuàng)建與之具有相同名稱和數(shù)值的變量如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會(huì)覆蓋同名的環(huán)境變量makefile中常見的自動(dòng)變量和環(huán)境變量make在啟動(dòng)makefile規(guī)則makefile的規(guī)則是make進(jìn)行處理的依據(jù),它包括了目標(biāo)體、依賴文件及其之間的命令語句。普通規(guī)則隱含規(guī)則模式規(guī)則makefile規(guī)則makefile的規(guī)則是make進(jìn)行處隱式規(guī)則隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的規(guī)則完成任務(wù),這樣,當(dāng)用戶使用它們時(shí)就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需把目標(biāo)文件列出即可例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@隱式規(guī)則隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的規(guī)則完成任務(wù),模式規(guī)則模式規(guī)則是用來定義相同處理規(guī)則的多個(gè)文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個(gè)文件建立相同的規(guī)則,從而簡化了makefile的編寫模式規(guī)則的格式類似于普通規(guī)則,這個(gè)規(guī)則中的相關(guān)文件前必須用“%”標(biāo)明OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@%.o:%.c
$(CC)$(CFLAGS)-c$<-o$@模式規(guī)則模式規(guī)則是用來定義相同處理規(guī)則的多個(gè)文件的。它不同于make的命令行選項(xiàng)make的命令行選項(xiàng)1.6ECLIPSE集成開發(fā)環(huán)境1.6ECLIPSE集成開發(fā)環(huán)境Eclipse
簡介(1)Eclipse是著名的跨平臺(tái)的集成開發(fā)環(huán)境(IDE),最初是由IBM公司開發(fā)的替代商業(yè)軟件VisualAgeForJava的下一代IDE開發(fā)環(huán)境,2001年11月貢獻(xiàn)給開源社區(qū),現(xiàn)在它由非營利軟件供應(yīng)商聯(lián)盟Eclipse基金會(huì)(EclipseFoundation)管理。2005年7月,穩(wěn)定版3.1.0發(fā)布。目前最新的穩(wěn)定版本為3.5
Eclipse簡介(1)Eclipse是著名的跨平臺(tái)的集成Eclipse
簡介(2)Eclipse本身只是一個(gè)框架平臺(tái),最初主要用于Java語言的開發(fā)。但是眾多插件的支持使得Eclipse可以支持其他語言的開發(fā),如C/C++、C#、Perl、Cobol等等。許多軟件開發(fā)商以Eclipse為框架開發(fā)了己的IDE。Eclipse用Java實(shí)現(xiàn),運(yùn)行時(shí)需要JRE(JavaRuntime
Envrionment)的支持
Eclipse簡介(2)Eclipse本身只是一個(gè)框架平臺(tái)Eclipse
術(shù)語工作臺(tái)(workbench)
--提供了一個(gè)或多個(gè)透視圖。
透視圖(perspective)
--
透視圖是工作臺(tái)中的一組視圖和編輯器。每個(gè)透視圖可具有一組不同的視圖,它定義了視圖在工作臺(tái)中的布局。
視圖(view)
--視圖是工作臺(tái)內(nèi)的可視組件,通常用來瀏覽分層信息。
編輯器(editor)
--編輯器也是工作臺(tái)內(nèi)的可視組件,通常用來編輯或?yàn)g覽資源。
Eclipse術(shù)語工作臺(tái)(workbench)工作臺(tái)(workbench)工作臺(tái)(workbench)視圖(view)視圖(view)編輯器(editor)編輯器(editor)Eclipse
使用(1)運(yùn)行eclipse
Eclipse使用(1)運(yùn)行eclipseEclipse
使用(2)創(chuàng)建C工程
Eclipse使用(2)創(chuàng)建C工程Eclipse
使用(3)創(chuàng)建C工程
Eclipse使用(3)創(chuàng)建C工程Eclipse
使用(4)創(chuàng)建C工程
Eclipse使用(4)創(chuàng)建C工程Eclipse
使用(5)添加源文件
Eclipse使用(5)添加源文件Eclipse
使用(6)添加源文件
Eclipse使用(6)添加源文件Eclipse
使用(7)編輯代碼
Eclipse使用(7)編輯代碼Eclipse
使用(8)編譯程序
Eclipse使用(8)編譯程序Eclipse
使用(9)運(yùn)行程序
Eclipse使用(9)運(yùn)行程序Eclipse
使用(10)右鍵單擊編輯框最左邊區(qū)域,設(shè)置斷點(diǎn)
Eclipse使用(10)右鍵單擊編輯框最左邊區(qū)域,設(shè)置斷Eclipse
使用(11)調(diào)試程序
Eclipse使用(11)調(diào)試程序Eclipse
使用(12)調(diào)試程序
Eclipse使用(12)調(diào)試程序Eclipse
使用(13)交叉編譯
Eclipse使用(13)交叉編譯Eclipse
使用(14)交叉編譯
Eclipse使用(14)交叉編譯Eclipse
使用(15)交叉編譯
Eclipse使用(15)交叉編譯Eclipse
使用(16)交叉編譯
Eclipse使用(16)交叉編譯Eclipse
使用(17)交叉調(diào)試
Eclipse使用(17)交叉調(diào)試Eclipse
使用(18)交叉調(diào)試
Eclipse使用(18)交叉調(diào)試Eclipse
使用(19)交叉調(diào)試
Eclipse使用(19)交叉調(diào)試Eclipse
使用(20)交叉調(diào)試
Eclipse使用(20)交叉調(diào)試Eclipse
使用(21)交叉調(diào)試
Eclipse使用(21)交叉調(diào)試Eclipse
使用(22)交叉調(diào)試
Eclipse使用(22)交叉調(diào)試實(shí)驗(yàn)實(shí)驗(yàn)實(shí)驗(yàn)-vi使用練習(xí)1.實(shí)驗(yàn)?zāi)康?通過指定指令的vi操作練習(xí),使讀者能夠熟練使用vi中的常見操作,并且熟悉vi的3種模式,如果讀者能夠熟練掌握實(shí)驗(yàn)內(nèi)容中所要求的內(nèi)容,則表明對(duì)vi的操作已經(jīng)很熟練了。2.實(shí)驗(yàn)內(nèi)容詳見教材實(shí)驗(yàn)-vi使用練習(xí)1.實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)-用gdb調(diào)試程序的bug1.實(shí)驗(yàn)?zāi)康耐ㄟ^調(diào)試一個(gè)有問題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過對(duì)有問題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問題和解決問題的能力。這是一個(gè)很小的程序,只有35行,希望讀者認(rèn)真調(diào)試。2.實(shí)驗(yàn)內(nèi)容 詳見教材實(shí)驗(yàn)-用gdb調(diào)試程序的bug1.實(shí)驗(yàn)?zāi)康乃伎寂c練習(xí)在Linux下綜合使用vi、gcc編譯器和gdb調(diào)試器開發(fā)漢諾塔游戲程序。思考與練習(xí)在Linux下綜合使用vi、gcc編譯器和gdb調(diào)第一章嵌入式LinuxC語言開發(fā)工具嵌入式Linux-C語言程序設(shè)計(jì)基礎(chǔ)教程第1章-課件本章的要求了解C語言產(chǎn)生的歷史背景熟悉嵌入式Linux下C語言的開發(fā)環(huán)境熟練使用嵌入式Linux下的編輯器vi熟悉嵌入式Linux下的編譯器GCC熟悉嵌入式Linux下的調(diào)試器GDB熟悉嵌入式Linux下的工程管理器make了解eclipse集成開發(fā)環(huán)境
本章的要求了解C語言產(chǎn)生的歷史背景1.1嵌入式LINUX下C語言概述1.1嵌入式LINUX下C語言概述C語言C語言最早是由貝爾實(shí)驗(yàn)室的DennisRitchie為了UNIX的輔助開發(fā)而編寫的,它是在B語言的基礎(chǔ)上開發(fā)出來的。盡管C語言不是專門針對(duì)UNIX操作系統(tǒng)或機(jī)器編寫的,但它與UNIX系統(tǒng)的關(guān)系十分緊密。由于它的硬件無關(guān)性和可移植性,使C語言逐漸成為世界上使用最廣泛計(jì)算機(jī)語言。為了進(jìn)一步規(guī)范C語言的硬件無關(guān)性,1987年,美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)根據(jù)C語言問世以來各種版本對(duì)C語言的發(fā)展和擴(kuò)充,制定了新的標(biāo)準(zhǔn),稱為ANSIC。ANSIC語言比原來的標(biāo)準(zhǔn)C語言有了很大的發(fā)展。目前流行的C語言編譯系統(tǒng)都是以它為基礎(chǔ)的。C語言C語言最早是由貝爾實(shí)驗(yàn)室的DennisRitchieC語言的特點(diǎn)C語言的成功并不是偶然的,它強(qiáng)大的功能和它的可移植性讓它能在各種硬件平臺(tái)上游刃自如。總體而言,C語言有如下特點(diǎn)。
C語言是“中級(jí)語言”。它把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。C語言可以像匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作,而這三者是計(jì)算機(jī)最基本的工作單元。
C語言是結(jié)構(gòu)化的語言。C語言采用代碼及數(shù)據(jù)分隔,使程序的各個(gè)部分除了必要的信息交流外彼此獨(dú)立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?,便于使用、維護(hù)以及調(diào)試。C語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便地調(diào)用,并具有多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。
C語言功能齊全。C語言具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外,C語言也具有強(qiáng)大的圖形功能,支持多種顯示器和驅(qū)動(dòng)器,而且計(jì)算功能、邏輯判斷功能也比較強(qiáng)大,可以實(shí)現(xiàn)決策目的。
C語言可移植性強(qiáng)。C語言適合多種操作系統(tǒng),如DOS、Windows、Linux,也適合多種體系結(jié)構(gòu),因此尤其適合在嵌入式領(lǐng)域的開發(fā)。C語言的特點(diǎn)C語言的成功并不是偶然的,它強(qiáng)大的功能和它的可移1.2嵌入式LINUX編輯器VI的使用1.2嵌入式LINUX編輯器VI的使用編輯器Linux中最常用的編輯器有vi(vim)和emacs編輯器Linux中最常用的編輯器有vi(vim)和emacsvi:命令-輸入-底行模式命令模式底行模式輸入模式vi:命令-輸入-底行模式命令模式底行模式輸入模式vi用法---編輯新增(append)
--a
從光標(biāo)所在位置後面開始新增資料,光標(biāo)後的資料隨新增資料向後移動(dòng)。
--A
從光標(biāo)所在列最後面的地方開始新增資料。插入(insert)
--i從光標(biāo)所在位置前面開始插入資料,光標(biāo)後的資料隨新增資料向後移動(dòng)。
--I從光標(biāo)列的第一個(gè)非空白字符前面開始插入資料。開始(open)
--o
在光標(biāo)所在列下新增一列并進(jìn)入輸入模式。
--O
在光標(biāo)所在列上方新增一列并進(jìn)入輸入模式。vi用法---編輯新增(append)
--a從vi用法---修改和刪除x
刪除光標(biāo)所在字符。dd
刪除光標(biāo)所在的列。r修改光標(biāo)所在字符,r後接著要修正的字符R進(jìn)入取代狀態(tài),新增資料會(huì)覆改原先資料,直到按[ESC]回到指令模式下為止。s
刪除光標(biāo)所在字符,并進(jìn)入輸入模式。S
刪除光標(biāo)所在的列,并進(jìn)入輸入模式。vi用法---修改和刪除x刪除光標(biāo)所在字符。vi用法---退出<:q>不保存退出<:q!>不保存強(qiáng)制性退出<:w>保存編輯<:wfilename>存入文件filename中<:w!filename>強(qiáng)制性存入文件filename中<:wq>(<:x>)保存并退出(shift+zz)vi用法---退出<:q>不保存退出vi用法---光標(biāo)移動(dòng)<b>移動(dòng)到當(dāng)前單詞的開始<e>移動(dòng)到當(dāng)前單詞的結(jié)尾<w>向前移動(dòng)一個(gè)單詞<h>向前移動(dòng)一個(gè)字符<j>向上移動(dòng)一行<k>向下移動(dòng)一行<l>向后移動(dòng)一個(gè)字符vi用法---光標(biāo)移動(dòng)<b>移動(dòng)到當(dāng)前單詞的開始vi用法---替換操作<r>替換光標(biāo)所在的字符<R>替換字符序列<cw>替換一個(gè)單詞<ce>同<cw><cb>替換光標(biāo)所在的前一字符<c$>替換自光標(biāo)位置至行尾的所有字符<C>同<c$><cc>替換當(dāng)前行vi用法---替換操作<r>替換光標(biāo)所在的字符vi用法---復(fù)制與粘貼</yw>將光標(biāo)所在單詞拷入剪貼板<y$>將光標(biāo)至行尾的字符拷入剪貼板<Y>同<y$><yy>將當(dāng)前行拷入剪貼板<p>將剪貼板中的內(nèi)容粘貼在光標(biāo)后<P>將剪貼板中的內(nèi)容粘貼在光標(biāo)前vi用法---復(fù)制與粘貼</yw>將光標(biāo)所在單詞拷入剪貼1.3嵌入式LINUX編譯器GCC的使用1.3嵌入式LINUX編譯器GCC的使用gcc編譯器GNUCC(簡稱為gcc)是GNU項(xiàng)目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能強(qiáng)大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc又是一個(gè)交叉平臺(tái)編譯器,它能夠在當(dāng)前CPU平臺(tái)上為多種不同體系結(jié)構(gòu)的硬件平臺(tái)開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。gcc編譯器GNUCC(簡稱為gcc)是GNU項(xiàng)目中符合gcc編譯過程gcc編譯過程gcc所支持后綴名解釋gcc所支持后綴名解釋gcc---預(yù)處理階段在該階段,對(duì)包含的頭文件(#include)和宏定義(#define、#ifdef等)進(jìn)行處理??梢允褂胓cc的選項(xiàng)“-E”
讓gcc在預(yù)處理結(jié)束后停止編譯過程。
[root@localhostgcc]#gcc–Ehello.c–ohello.i/*hello.i*/……typedefint(*__gconv_trans_fct)(struct__gconv_step*,struct__gconv_step_data*,void*,__constunsignedchar*,__constunsignedchar**,__constunsignedchar*,unsignedchar**,size_t*);……#2"hello.c"2intmain(){ printf("Hello!Thisisourembeddedworld!\n"); return0;}gcc---預(yù)處理階段在該階段,對(duì)包含的頭文件(#incgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個(gè)階段中,gcc首先要檢查代碼的規(guī)范性、是否有語法錯(cuò)誤等,以確定代碼的實(shí)際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項(xiàng)來進(jìn)行查看,該選項(xiàng)只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。[root@localhostgcc]#gcc–Shello.i–ohello.sgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個(gè)階gcc---編譯階段(2)/*hello.s*/.file "hello.c".section .rodata.align4.LC0:.string "Hello!Thisisourembeddedworld!".text.globlmain.typemain,@functionmain:pushl%ebpmovl%esp,%ebpsubl$8,%espandl$-16,%espmovl$0,%eax
addl$15,%eaxaddl$15,%eaxshrl$4,%eaxsall$4,%eaxsubl%eax,%espsubl$12,%esppushl$.LC0callputsaddl$16,%espmovl$0,%eaxleaveret.size main,.-main.ident "GCC:(GNU)4.0.0200X0Y19(RedHat4.0.0-8)".section .note.GNU-stack,"",@progbitsgcc---編譯階段(2)/*hello.s*/gcc---常用選項(xiàng)[root@localhostgcc]gcchello1.c–I/root/workplace/gcc/-ohello1gcc---常用選項(xiàng)[root@localhostgcgcc---庫選項(xiàng)函數(shù)庫分為靜態(tài)庫和動(dòng)態(tài)庫兩種,靜態(tài)庫是一系列的目標(biāo)文件(.o文件)的歸檔文件(文件名格式為libname.a),如果在編譯某個(gè)程序時(shí)鏈接靜態(tài)庫,則鏈接器將會(huì)搜索靜態(tài)庫,從中提取出它所需要的目標(biāo)文件并直接拷貝到該程序的可執(zhí)行二進(jìn)制文件(ELF格式文件)之中;動(dòng)態(tài)庫(文件名格式為libname.so[.主版本號(hào).次版本號(hào).發(fā)行號(hào)])在程序編譯時(shí)并不會(huì)被鏈接到目標(biāo)代碼中,而是在程序運(yùn)行時(shí)才被載入。gcc---庫選項(xiàng)函數(shù)庫分為靜態(tài)庫和動(dòng)態(tài)庫兩種,靜態(tài)庫是Linux函數(shù)庫的創(chuàng)建與使用(1)/*unsgn_pow.c:庫程序*/unsignedlonglongunsgn_pow(unsignedintx,unsignedinty){
unsignedlonglongres=1;
if(y==0){res=1;}elseif(y==1){res=x;
}else{res=x*unsgn_pow(x,y-1);
}returnres;}/*pow_test.c*/#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){unsignedintx,y;unsignedlonglongres;if((argc<3)||(sscanf(argv[1],"%u",&x)!=1)||(sscanf(argv[2],"%u",&y))!=1)
{printf("Usage:powbaseexponent\n");exit(1);}res=unsgn_pow(x,y);printf("%u^%u=%u\n",x,y,res);exit(0);}Linux函數(shù)庫的創(chuàng)建與使用(1)/*unsgn_pow.靜態(tài)庫$gcc-cunsgn_pow.c
$arrcsvlibpow.aunsgn_pow.o a-unsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow$./pow_test210 2^10=1024
靜態(tài)庫$gcc-cunsgn_pow.c動(dòng)態(tài)庫$gcc-fPIC-Wall-cunsgn_pow.c$gcc-shared-olibpow.sounsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow
在運(yùn)行可執(zhí)行程序之前,需要注冊(cè)動(dòng)態(tài)庫的路徑名。其方法有幾種:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH環(huán)境變量,或者將庫文件直接拷貝到/lib或者/usr/lib目錄下(這兩個(gè)目錄為系統(tǒng)的默認(rèn)的庫路徑名)。$cplibpow.so/lib$./pow_test210 2^10=1024
動(dòng)態(tài)庫$gcc-fPIC-Wall-cun靜態(tài)庫與動(dòng)態(tài)庫的比較動(dòng)態(tài)庫只有在使用它的程序執(zhí)行時(shí)才被鏈接使用,而不是將需要的部分直接編譯入可執(zhí)行文件中,并且一個(gè)動(dòng)態(tài)庫可以被多個(gè)程序使用故可稱為共享庫,而靜態(tài)庫將會(huì)整合到程序中,因此在程序執(zhí)行時(shí)不用加載靜態(tài)庫。從而可知,鏈接到靜態(tài)庫會(huì)使你的程序臃腫,并且難以升級(jí),但是可能會(huì)比較容易部署。而鏈接到動(dòng)態(tài)庫會(huì)使你的程序輕便,并且易于升級(jí),但是會(huì)難以部署。靜態(tài)庫與動(dòng)態(tài)庫的比較動(dòng)態(tài)庫只有在使用它的程序執(zhí)行時(shí)才被鏈接使gcc---警告選項(xiàng)(1)$gcc–ansiwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”
gcc---警告選項(xiàng)(1)$gcc–ansiwargcc---警告選項(xiàng)(2)$gcc–pedanticwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:5警告:ISOC90不支持“l(fā)onglong”warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”
$gcc–Wallwarning.c–owarningwarning.c:4警告:“main”的返回類型不是“int”warning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:5警告:未使用的變量“tmp”
gcc---警告選項(xiàng)(2)$gcc–pedanticgcc---優(yōu)化選項(xiàng)gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過編譯選項(xiàng)“-On”來控制優(yōu)化代碼的生成,其中n是一個(gè)代表優(yōu)化級(jí)別的整數(shù)。不同的優(yōu)化級(jí)別對(duì)應(yīng)不同的優(yōu)化處理工作。如使用優(yōu)化選項(xiàng)“-O”主要進(jìn)行線程跳轉(zhuǎn)(ThreadJump)和延遲退棧(DeferredStackPops)兩種優(yōu)化。使用優(yōu)化選項(xiàng)“-O2”除了完成所有“-O1”級(jí)別的優(yōu)化之外,同時(shí)還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項(xiàng)“-O3”則還包括循環(huán)展開和其他一些與處理器特性相關(guān)的優(yōu)化工作??赡苓m合使用優(yōu)化選項(xiàng)的場(chǎng)合:程序發(fā)行不太適合使用優(yōu)化選項(xiàng)的場(chǎng)合:程序開發(fā)gcc---優(yōu)化選項(xiàng)gcc可以對(duì)代碼進(jìn)行優(yōu)化,它通過編譯gcc---體系結(jié)構(gòu)相關(guān)選項(xiàng)gcc---體系結(jié)構(gòu)相關(guān)選項(xiàng)1.4嵌入式LINUX調(diào)試器GDB的使用1.4嵌入式LINUX調(diào)試器GDB的使用gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的VC工具等媲美。$gcc-gtest.c-otest$gdbtestGNUgdbRedHatLinux(-1.21rh)Copyright2004FreeSoftwareFoundation,Inc.GDBisfreesoftware,coveredbytheGNUGeneralPublicLicense,andyouarewelcometochangeitand/ordistributecopiesofitundercertainconditions.Type"showcopying"toseetheconditions.ThereisabsolutelynowarrantyforGDB.Type"showwarranty"fordetails.ThisGDBwasconfiguredas"i386-redhat-linux-gnu"...Usinghostlibthread_dblibrary"/lib/libthread_db.so.1".(gdb)gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的gdb使用方法(2)(gdb)b6Breakpoint1at0x804846d:filetest.c,line6.(gdb)l1#include<stdio.h>2intsum(intm);3intmain()4{5inti,n=0;6sum(50);7for(i=1;i<=50;i++)8{9 n+=i;10}(gdb)l11printf("Thesumof1~50is%d\n",n);1213}14intsum(intm)15{16inti,n=0;17for(i=1;i<=m;i++)18{19 n+=i;20}21printf("Thesumof1~mis=%d\n",n);20}(gdb)b19(gdb)cBreakpoin2,sum(m=50)attest.c:1919 printf(“Thesumof1-mis%d\n”,n);(gdb)bt#0 sum(m=50)attest.c:19#1 0x080483e8inmain()attest.c:6(gdb)infobNumTypeDispEnbAddressWhat1breakpointkeepy0x0804846dinmainattest.c:6(gdb)rStartingprogram:/root/workplace/gdb/testReadingsymbolsfromsharedobjectreadfromtargetmemory...done.LoadedsystemsuppliedDSOat0x5fb000Breakpoint1,main()attest.c:66sum(50);gdb使用方法(2)(gdb)b6(gdb)l(gdbgdb使用方法(3)(gdb)pn$1=0(gdb)pi$2=134518440(gdb)nThesumof1-mis12757for(i=1;i<=50;i++)(gdb)ssum(m=50)attest.c:1616inti,n=0;(gdb)cContinuing.Thesumof1-50is:1275Programexitedwithcode031.(gdb)helpListofclassesofcommands:aliases--Aliasesofothercommandsbreakpoints--Makingprogramstopatcertainpointsdata--Examiningdatafiles--Specifyingandexaminingfilesinternals--Maintenancecommands…Type"help"followedbyaclassnameforalistofcommandsinthatclass.Type"help"followedbycommandnameforfulldocumentation.Commandnameabbreviationsareallowedifunambiguous.(gdb)helpcallCallafunctionintheprogram.Theargumentisthefunctionnameandarguments,inthenotationofthecurrentworkinglanguage.Theresultisprintedandsavedinthevaluehistory,ifitisnotvoid.gdb使用方法(3)(gdb)pn(gdb)n(gdbgdb工作環(huán)境相關(guān)命令gdb工作環(huán)境相關(guān)命令gdb設(shè)置斷點(diǎn)與恢復(fù)命令gdb設(shè)置斷點(diǎn)與恢復(fù)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中查看運(yùn)行數(shù)據(jù)的相關(guān)命令gdb中查看運(yùn)行數(shù)據(jù)的相關(guān)命令1.5MAKE工程管理器1.5MAKE工程管理器make工程管理器工程管理器,顧名思義,是指管理較多的文件Make工程管理器也就是個(gè)“自動(dòng)編譯管理器”,這里的“自動(dòng)”是指它能構(gòu)根據(jù)文件時(shí)間戳自動(dòng)發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時(shí),它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作make工程管理器工程管理器,顧名思義,是指管理較多的文件makefile基本結(jié)構(gòu)(1)makefile是make讀入的惟一配置文件,因此本節(jié)的內(nèi)容實(shí)際就是講述makefile的編寫規(guī)則。在一個(gè)makefile中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件;要?jiǎng)?chuàng)建的目標(biāo)體所依賴的文件(dependency_file);創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command),這一行必須以制表符(tab鍵)開頭。makefile基本結(jié)構(gòu)(1)makefile是make讀入makefile基本結(jié)構(gòu)(2)makefile格式例子使用makefile
target:dependency_files<TAB >command/*該行必須以tab鍵開頭*/hello.o:hello.chello.h
gcc–chello.c–ohello.o$makehello.ogcc–chello.c–ohello.o$lshello.chello.hhello.omakefilemakefile基本結(jié)構(gòu)(2)makefile格式targe創(chuàng)建和使用makefile變量用來代替一個(gè)文本字符串變量定義的兩種方式遞歸展開方式VAR=var簡單方式VAR:=var變量使用$(VAR)OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)$(CC)$(OBJS)-odavidkang.o:kang.ckang.h
$(CC)$(CFLAGS)-ckang.c-okang.oyul.o:yul.cyul.h$(CC)$(CFLAGS)-cyul.c-oyul.o創(chuàng)建和使用makefile變量用來代替一個(gè)文本字符串OBJmakefile變量變量種類用戶自定義變量預(yù)定義變量自動(dòng)變量環(huán)境變量OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@kang.o:kang.ckang.h$(CC)$(CFLAGS)-c$<-o$@yul.o:yul.cyul.h
$(CC)$(CFLAGS)-c$<-o$@makefile變量變量種類OBJS=kang.oyumakefile中常用的預(yù)定義變量makefile中常用的預(yù)定義變量makefile中常見的自動(dòng)變量和環(huán)境變量make在啟動(dòng)時(shí)會(huì)自動(dòng)讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會(huì)創(chuàng)建與之具有相同名稱和數(shù)值的變量如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會(huì)覆蓋同名的環(huán)境變量makefile中常見的自動(dòng)變量和環(huán)境變量make在啟動(dòng)makefile規(guī)則makefile的規(guī)則是make進(jìn)行處理的依據(jù),它包括了目標(biāo)體、依賴文件及其之間的命令語句。普通規(guī)則隱含規(guī)則模式規(guī)則makefile規(guī)則makefile的規(guī)則是make進(jìn)行處隱式規(guī)則隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的規(guī)則完成任務(wù),這樣,當(dāng)用戶使用它們時(shí)就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需把目標(biāo)文件列出即可例子OBJS=kang.oyul.oCC=gccCFLAGS=-Wall-O-gdavid:$(OBJS)
$(CC)$^-o$@隱式規(guī)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025年中國先進(jìn)高分子材料行業(yè)市場(chǎng)前景預(yù)測(cè)及投資戰(zhàn)略規(guī)劃分析報(bào)告
- 2025年度國際貿(mào)易風(fēng)險(xiǎn)承擔(dān)協(xié)議
- 保險(xiǎn)行業(yè)股權(quán)轉(zhuǎn)讓居間協(xié)議
- 2025年度歷史文化街區(qū)車位包銷及文化旅游合同
- 2025年度商業(yè)合作保密協(xié)議書(含供應(yīng)鏈管理保密條款)
- 科技發(fā)展與電商平臺(tái)數(shù)據(jù)驅(qū)動(dòng)的商業(yè)模式創(chuàng)新
- 2025年度律師委托協(xié)議:公司股權(quán)轉(zhuǎn)讓法律事務(wù)代理合同
- 2025年手動(dòng)圓鋸機(jī)行業(yè)深度研究分析報(bào)告
- 2025年度合伙美發(fā)工作室技術(shù)合作合同協(xié)議
- 二零二五年度公寓租賃人身意外傷害免責(zé)協(xié)議
- 人教版初中九年級(jí)下學(xué)期體育教案全集(附教學(xué)計(jì)劃)
- 2024年湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測(cè)試題庫及答案解析
- 2024年黑龍江職業(yè)學(xué)院單招職業(yè)技能測(cè)試題庫及答案解析
- 礦山井架設(shè)計(jì)規(guī)范
- 空天地一體化公路智能巡查技術(shù)應(yīng)用與實(shí)踐
- CJJ129-2009 城市快速路設(shè)計(jì)規(guī)程
- punctuation-英語標(biāo)點(diǎn)的使用
- 股權(quán)糾紛案例分析申訴報(bào)告
- 2022云南省中考道法真題試卷和答案
- 如何在質(zhì)保到期后提供售后服務(wù)
- 勞務(wù)經(jīng)濟(jì)人培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論