嵌入式Linux-C語言程序設(shè)計基礎(chǔ)教程第1章-課件_第1頁
嵌入式Linux-C語言程序設(shè)計基礎(chǔ)教程第1章-課件_第2頁
嵌入式Linux-C語言程序設(shè)計基礎(chǔ)教程第1章-課件_第3頁
嵌入式Linux-C語言程序設(shè)計基礎(chǔ)教程第1章-課件_第4頁
嵌入式Linux-C語言程序設(shè)計基礎(chǔ)教程第1章-課件_第5頁
已閱讀5頁,還剩163頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一章嵌入式LinuxC語言開發(fā)工具嵌入式Linux-C語言程序設(shè)計基礎(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語言最早是由貝爾實驗室的DennisRitchie為了UNIX的輔助開發(fā)而編寫的,它是在B語言的基礎(chǔ)上開發(fā)出來的。盡管C語言不是專門針對UNIX操作系統(tǒng)或機器編寫的,但它與UNIX系統(tǒng)的關(guān)系十分緊密。由于它的硬件無關(guān)性和可移植性,使C語言逐漸成為世界上使用最廣泛計算機語言。為了進(jìn)一步規(guī)范C語言的硬件無關(guān)性,1987年,美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)根據(jù)C語言問世以來各種版本對C語言的發(fā)展和擴充,制定了新的標(biāo)準(zhǔn),稱為ANSIC。ANSIC語言比原來的標(biāo)準(zhǔn)C語言有了很大的發(fā)展。目前流行的C語言編譯系統(tǒng)都是以它為基礎(chǔ)的。C語言C語言最早是由貝爾實驗室的DennisRitchieC語言的特點C語言的成功并不是偶然的,它強大的功能和它的可移植性讓它能在各種硬件平臺上游刃自如??傮w而言,C語言有如下特點。

C語言是“中級語言”。它把高級語言的基本結(jié)構(gòu)和語句與低級語言的實用性結(jié)合起來。C語言可以像匯編語言一樣對位、字節(jié)和地址進(jìn)行操作,而這三者是計算機最基本的工作單元。

C語言是結(jié)構(gòu)化的語言。C語言采用代碼及數(shù)據(jù)分隔,使程序的各個部分除了必要的信息交流外彼此獨立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦?,便于使用、維護以及調(diào)試。C語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便地調(diào)用,并具有多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。

C語言功能齊全。C語言具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外,C語言也具有強大的圖形功能,支持多種顯示器和驅(qū)動器,而且計算功能、邏輯判斷功能也比較強大,可以實現(xiàn)決策目的。

C語言可移植性強。C語言適合多種操作系統(tǒng),如DOS、Windows、Linux,也適合多種體系結(jié)構(gòu),因此尤其適合在嵌入式領(lǐng)域的開發(fā)。C語言的特點C語言的成功并不是偶然的,它強大的功能和它的可移1.2嵌入式LINUX編輯器VI的使用1.2嵌入式LINUX編輯器VI的使用編輯器Linux中最常用的編輯器有vi(vim)和emacs編輯器Linux中最常用的編輯器有vi(vim)和emacsvi:命令-輸入-底行模式命令模式底行模式輸入模式vi:命令-輸入-底行模式命令模式底行模式輸入模式vi用法---編輯新增(append)

--a

從光標(biāo)所在位置後面開始新增資料,光標(biāo)後的資料隨新增資料向後移動。

--A

從光標(biāo)所在列最後面的地方開始新增資料。插入(insert)

--i從光標(biāo)所在位置前面開始插入資料,光標(biāo)後的資料隨新增資料向後移動。

--I從光標(biāo)列的第一個非空白字符前面開始插入資料。開始(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),新增資料會覆改原先資料,直到按[ESC]回到指令模式下為止。s

刪除光標(biāo)所在字符,并進(jìn)入輸入模式。S

刪除光標(biāo)所在的列,并進(jìn)入輸入模式。vi用法---修改和刪除x刪除光標(biāo)所在字符。vi用法---退出<:q>不保存退出<:q!>不保存強制性退出<:w>保存編輯<:wfilename>存入文件filename中<:w!filename>強制性存入文件filename中<:wq>(<:x>)保存并退出(shift+zz)vi用法---退出<:q>不保存退出vi用法---光標(biāo)移動<b>移動到當(dāng)前單詞的開始<e>移動到當(dāng)前單詞的結(jié)尾<w>向前移動一個單詞<h>向前移動一個字符<j>向上移動一行<k>向下移動一行<l>向后移動一個字符vi用法---光標(biāo)移動<b>移動到當(dāng)前單詞的開始vi用法---替換操作<r>替換光標(biāo)所在的字符<R>替換字符序列<cw>替換一個單詞<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項目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能強大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc又是一個交叉平臺編譯器,它能夠在當(dāng)前CPU平臺上為多種不同體系結(jié)構(gòu)的硬件平臺開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。gcc編譯器GNUCC(簡稱為gcc)是GNU項目中符合gcc編譯過程gcc編譯過程gcc所支持后綴名解釋gcc所支持后綴名解釋gcc---預(yù)處理階段在該階段,對包含的頭文件(#include)和宏定義(#define、#ifdef等)進(jìn)行處理??梢允褂胓cc的選項“-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ù)處理階段在該階段,對包含的頭文件(#incgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個階段中,gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項來進(jìn)行查看,該選項只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。[root@localhostgcc]#gcc–Shello.i–ohello.sgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個階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---常用選項[root@localhostgcc]gcchello1.c–I/root/workplace/gcc/-ohello1gcc---常用選項[root@localhostgcgcc---庫選項函數(shù)庫分為靜態(tài)庫和動態(tài)庫兩種,靜態(tài)庫是一系列的目標(biāo)文件(.o文件)的歸檔文件(文件名格式為libname.a),如果在編譯某個程序時鏈接靜態(tài)庫,則鏈接器將會搜索靜態(tài)庫,從中提取出它所需要的目標(biāo)文件并直接拷貝到該程序的可執(zhí)行二進(jìn)制文件(ELF格式文件)之中;動態(tài)庫(文件名格式為libname.so[.主版本號.次版本號.發(fā)行號])在程序編譯時并不會被鏈接到目標(biāo)代碼中,而是在程序運行時才被載入。gcc---庫選項函數(shù)庫分為靜態(tài)庫和動態(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動態(tài)庫$gcc-fPIC-Wall-cunsgn_pow.c$gcc-shared-olibpow.sounsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow

在運行可執(zhí)行程序之前,需要注冊動態(tài)庫的路徑名。其方法有幾種:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH環(huán)境變量,或者將庫文件直接拷貝到/lib或者/usr/lib目錄下(這兩個目錄為系統(tǒng)的默認(rèn)的庫路徑名)。$cplibpow.so/lib$./pow_test210 2^10=1024

動態(tài)庫$gcc-fPIC-Wall-cun靜態(tài)庫與動態(tài)庫的比較動態(tài)庫只有在使用它的程序執(zhí)行時才被鏈接使用,而不是將需要的部分直接編譯入可執(zhí)行文件中,并且一個動態(tài)庫可以被多個程序使用故可稱為共享庫,而靜態(tài)庫將會整合到程序中,因此在程序執(zhí)行時不用加載靜態(tài)庫。從而可知,鏈接到靜態(tài)庫會使你的程序臃腫,并且難以升級,但是可能會比較容易部署。而鏈接到動態(tài)庫會使你的程序輕便,并且易于升級,但是會難以部署。靜態(tài)庫與動態(tài)庫的比較動態(tài)庫只有在使用它的程序執(zhí)行時才被鏈接使gcc---警告選項(1)$gcc–ansiwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”

gcc---警告選項(1)$gcc–ansiwargcc---警告選項(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---警告選項(2)$gcc–pedanticgcc---優(yōu)化選項gcc可以對代碼進(jìn)行優(yōu)化,它通過編譯選項“-On”來控制優(yōu)化代碼的生成,其中n是一個代表優(yōu)化級別的整數(shù)。不同的優(yōu)化級別對應(yīng)不同的優(yōu)化處理工作。如使用優(yōu)化選項“-O”主要進(jìn)行線程跳轉(zhuǎn)(ThreadJump)和延遲退棧(DeferredStackPops)兩種優(yōu)化。使用優(yōu)化選項“-O2”除了完成所有“-O1”級別的優(yōu)化之外,同時還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項“-O3”則還包括循環(huán)展開和其他一些與處理器特性相關(guān)的優(yōu)化工作??赡苓m合使用優(yōu)化選項的場合:程序發(fā)行不太適合使用優(yōu)化選項的場合:程序開發(fā)gcc---優(yōu)化選項gcc可以對代碼進(jìn)行優(yōu)化,它通過編譯gcc---體系結(jié)構(gòu)相關(guān)選項gcc---體系結(jié)構(gòu)相關(guān)選項1.4嵌入式LINUX調(diào)試器GDB的使用1.4嵌入式LINUX調(diào)試器GDB的使用gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒有圖形化的友好界面,但是它強大的功能也足以與微軟的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è)置斷點與恢復(fù)命令gdb設(shè)置斷點與恢復(fù)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中查看運行數(shù)據(jù)的相關(guān)命令gdb中查看運行數(shù)據(jù)的相關(guān)命令1.5MAKE工程管理器1.5MAKE工程管理器make工程管理器工程管理器,顧名思義,是指管理較多的文件Make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能構(gòu)根據(jù)文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時,它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作make工程管理器工程管理器,顧名思義,是指管理較多的文件makefile基本結(jié)構(gòu)(1)makefile是make讀入的惟一配置文件,因此本節(jié)的內(nèi)容實際就是講述makefile的編寫規(guī)則。在一個makefile中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件;要創(chuàng)建的目標(biāo)體所依賴的文件(dependency_file);創(chuàng)建每個目標(biāo)體時需要運行的命令(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變量用來代替一個文本字符串變量定義的兩種方式遞歸展開方式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變量用來代替一個文本字符串OBJmakefile變量變量種類用戶自定義變量預(yù)定義變量自動變量環(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中常見的自動變量和環(huán)境變量make在啟動時會自動讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會創(chuàng)建與之具有相同名稱和數(shù)值的變量如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會覆蓋同名的環(huán)境變量makefile中常見的自動變量和環(huán)境變量make在啟動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)用戶使用它們時就不必詳細(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ī)則的多個文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個文件建立相同的規(guī)則,從而簡化了makefile的編寫模式規(guī)則的格式類似于普通規(guī)則,這個規(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ī)則的多個文件的。它不同于make的命令行選項make的命令行選項1.6ECLIPSE集成開發(fā)環(huán)境1.6ECLIPSE集成開發(fā)環(huán)境Eclipse

簡介(1)Eclipse是著名的跨平臺的集成開發(fā)環(huán)境(IDE),最初是由IBM公司開發(fā)的替代商業(yè)軟件VisualAgeForJava的下一代IDE開發(fā)環(huán)境,2001年11月貢獻(xiàn)給開源社區(qū),現(xiàn)在它由非營利軟件供應(yīng)商聯(lián)盟Eclipse基金會(EclipseFoundation)管理。2005年7月,穩(wěn)定版3.1.0發(fā)布。目前最新的穩(wěn)定版本為3.5

Eclipse簡介(1)Eclipse是著名的跨平臺的集成Eclipse

簡介(2)Eclipse本身只是一個框架平臺,最初主要用于Java語言的開發(fā)。但是眾多插件的支持使得Eclipse可以支持其他語言的開發(fā),如C/C++、C#、Perl、Cobol等等。許多軟件開發(fā)商以Eclipse為框架開發(fā)了己的IDE。Eclipse用Java實現(xiàn),運行時需要JRE(JavaRuntime

Envrionment)的支持

Eclipse簡介(2)Eclipse本身只是一個框架平臺Eclipse

術(shù)語工作臺(workbench)

--提供了一個或多個透視圖。

透視圖(perspective)

--

透視圖是工作臺中的一組視圖和編輯器。每個透視圖可具有一組不同的視圖,它定義了視圖在工作臺中的布局。

視圖(view)

--視圖是工作臺內(nèi)的可視組件,通常用來瀏覽分層信息。

編輯器(editor)

--編輯器也是工作臺內(nèi)的可視組件,通常用來編輯或瀏覽資源。

Eclipse術(shù)語工作臺(workbench)工作臺(workbench)工作臺(workbench)視圖(view)視圖(view)編輯器(editor)編輯器(editor)Eclipse

使用(1)運行eclipse

Eclipse使用(1)運行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)運行程序

Eclipse使用(9)運行程序Eclipse

使用(10)右鍵單擊編輯框最左邊區(qū)域,設(shè)置斷點

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)試實驗實驗實驗-vi使用練習(xí)1.實驗?zāi)康?通過指定指令的vi操作練習(xí),使讀者能夠熟練使用vi中的常見操作,并且熟悉vi的3種模式,如果讀者能夠熟練掌握實驗內(nèi)容中所要求的內(nèi)容,則表明對vi的操作已經(jīng)很熟練了。2.實驗內(nèi)容詳見教材實驗-vi使用練習(xí)1.實驗?zāi)康膶嶒?用gdb調(diào)試程序的bug1.實驗?zāi)康耐ㄟ^調(diào)試一個有問題的程序,使讀者進(jìn)一步熟練使用vi操作,而且熟練掌握gcc編譯命令及gdb的調(diào)試命令,通過對有問題程序的跟蹤調(diào)試,進(jìn)一步提高發(fā)現(xiàn)問題和解決問題的能力。這是一個很小的程序,只有35行,希望讀者認(rèn)真調(diào)試。2.實驗內(nèi)容 詳見教材實驗-用gdb調(diào)試程序的bug1.實驗?zāi)康乃伎寂c練習(xí)在Linux下綜合使用vi、gcc編譯器和gdb調(diào)試器開發(fā)漢諾塔游戲程序。思考與練習(xí)在Linux下綜合使用vi、gcc編譯器和gdb調(diào)第一章嵌入式LinuxC語言開發(fā)工具嵌入式Linux-C語言程序設(shè)計基礎(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語言最早是由貝爾實驗室的DennisRitchie為了UNIX的輔助開發(fā)而編寫的,它是在B語言的基礎(chǔ)上開發(fā)出來的。盡管C語言不是專門針對UNIX操作系統(tǒng)或機器編寫的,但它與UNIX系統(tǒng)的關(guān)系十分緊密。由于它的硬件無關(guān)性和可移植性,使C語言逐漸成為世界上使用最廣泛計算機語言。為了進(jìn)一步規(guī)范C語言的硬件無關(guān)性,1987年,美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)根據(jù)C語言問世以來各種版本對C語言的發(fā)展和擴充,制定了新的標(biāo)準(zhǔn),稱為ANSIC。ANSIC語言比原來的標(biāo)準(zhǔn)C語言有了很大的發(fā)展。目前流行的C語言編譯系統(tǒng)都是以它為基礎(chǔ)的。C語言C語言最早是由貝爾實驗室的DennisRitchieC語言的特點C語言的成功并不是偶然的,它強大的功能和它的可移植性讓它能在各種硬件平臺上游刃自如??傮w而言,C語言有如下特點。

C語言是“中級語言”。它把高級語言的基本結(jié)構(gòu)和語句與低級語言的實用性結(jié)合起來。C語言可以像匯編語言一樣對位、字節(jié)和地址進(jìn)行操作,而這三者是計算機最基本的工作單元。

C語言是結(jié)構(gòu)化的語言。C語言采用代碼及數(shù)據(jù)分隔,使程序的各個部分除了必要的信息交流外彼此獨立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦阌谑褂?、維護以及調(diào)試。C語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便地調(diào)用,并具有多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。

C語言功能齊全。C語言具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外,C語言也具有強大的圖形功能,支持多種顯示器和驅(qū)動器,而且計算功能、邏輯判斷功能也比較強大,可以實現(xiàn)決策目的。

C語言可移植性強。C語言適合多種操作系統(tǒng),如DOS、Windows、Linux,也適合多種體系結(jié)構(gòu),因此尤其適合在嵌入式領(lǐng)域的開發(fā)。C語言的特點C語言的成功并不是偶然的,它強大的功能和它的可移1.2嵌入式LINUX編輯器VI的使用1.2嵌入式LINUX編輯器VI的使用編輯器Linux中最常用的編輯器有vi(vim)和emacs編輯器Linux中最常用的編輯器有vi(vim)和emacsvi:命令-輸入-底行模式命令模式底行模式輸入模式vi:命令-輸入-底行模式命令模式底行模式輸入模式vi用法---編輯新增(append)

--a

從光標(biāo)所在位置後面開始新增資料,光標(biāo)後的資料隨新增資料向後移動。

--A

從光標(biāo)所在列最後面的地方開始新增資料。插入(insert)

--i從光標(biāo)所在位置前面開始插入資料,光標(biāo)後的資料隨新增資料向後移動。

--I從光標(biāo)列的第一個非空白字符前面開始插入資料。開始(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),新增資料會覆改原先資料,直到按[ESC]回到指令模式下為止。s

刪除光標(biāo)所在字符,并進(jìn)入輸入模式。S

刪除光標(biāo)所在的列,并進(jìn)入輸入模式。vi用法---修改和刪除x刪除光標(biāo)所在字符。vi用法---退出<:q>不保存退出<:q!>不保存強制性退出<:w>保存編輯<:wfilename>存入文件filename中<:w!filename>強制性存入文件filename中<:wq>(<:x>)保存并退出(shift+zz)vi用法---退出<:q>不保存退出vi用法---光標(biāo)移動<b>移動到當(dāng)前單詞的開始<e>移動到當(dāng)前單詞的結(jié)尾<w>向前移動一個單詞<h>向前移動一個字符<j>向上移動一行<k>向下移動一行<l>向后移動一個字符vi用法---光標(biāo)移動<b>移動到當(dāng)前單詞的開始vi用法---替換操作<r>替換光標(biāo)所在的字符<R>替換字符序列<cw>替換一個單詞<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項目中符合ANSIC標(biāo)準(zhǔn)的編譯系統(tǒng),能夠編譯用C、C++和ObjectC等語言編寫的程序。gcc不僅功能強大,而且可以編譯如C、C++、ObjectC、Java、Fortran、Pascal、Modula-3和Ada等多種語言,而且gcc又是一個交叉平臺編譯器,它能夠在當(dāng)前CPU平臺上為多種不同體系結(jié)構(gòu)的硬件平臺開發(fā)軟件,因此尤其適合在嵌入式領(lǐng)域的開發(fā)編譯。gcc編譯器GNUCC(簡稱為gcc)是GNU項目中符合gcc編譯過程gcc編譯過程gcc所支持后綴名解釋gcc所支持后綴名解釋gcc---預(yù)處理階段在該階段,對包含的頭文件(#include)和宏定義(#define、#ifdef等)進(jìn)行處理??梢允褂胓cc的選項“-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ù)處理階段在該階段,對包含的頭文件(#incgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個階段中,gcc首先要檢查代碼的規(guī)范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤后,gcc把代碼翻譯成匯編語言。用戶可以使用“-S”選項來進(jìn)行查看,該選項只進(jìn)行編譯而不進(jìn)行匯編,生成匯編代碼。[root@localhostgcc]#gcc–Shello.i–ohello.sgcc---編譯階段(1)接下來進(jìn)行的是編譯階段,在這個階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---常用選項[root@localhostgcc]gcchello1.c–I/root/workplace/gcc/-ohello1gcc---常用選項[root@localhostgcgcc---庫選項函數(shù)庫分為靜態(tài)庫和動態(tài)庫兩種,靜態(tài)庫是一系列的目標(biāo)文件(.o文件)的歸檔文件(文件名格式為libname.a),如果在編譯某個程序時鏈接靜態(tài)庫,則鏈接器將會搜索靜態(tài)庫,從中提取出它所需要的目標(biāo)文件并直接拷貝到該程序的可執(zhí)行二進(jìn)制文件(ELF格式文件)之中;動態(tài)庫(文件名格式為libname.so[.主版本號.次版本號.發(fā)行號])在程序編譯時并不會被鏈接到目標(biāo)代碼中,而是在程序運行時才被載入。gcc---庫選項函數(shù)庫分為靜態(tài)庫和動態(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動態(tài)庫$gcc-fPIC-Wall-cunsgn_pow.c$gcc-shared-olibpow.sounsgn_pow.o$gcc-opow_testpow_test.c-L.–lpow

在運行可執(zhí)行程序之前,需要注冊動態(tài)庫的路徑名。其方法有幾種:修改/etc/ld.so.conf文件,或者修改LD_LIBRARY_PATH環(huán)境變量,或者將庫文件直接拷貝到/lib或者/usr/lib目錄下(這兩個目錄為系統(tǒng)的默認(rèn)的庫路徑名)。$cplibpow.so/lib$./pow_test210 2^10=1024

動態(tài)庫$gcc-fPIC-Wall-cun靜態(tài)庫與動態(tài)庫的比較動態(tài)庫只有在使用它的程序執(zhí)行時才被鏈接使用,而不是將需要的部分直接編譯入可執(zhí)行文件中,并且一個動態(tài)庫可以被多個程序使用故可稱為共享庫,而靜態(tài)庫將會整合到程序中,因此在程序執(zhí)行時不用加載靜態(tài)庫。從而可知,鏈接到靜態(tài)庫會使你的程序臃腫,并且難以升級,但是可能會比較容易部署。而鏈接到動態(tài)庫會使你的程序輕便,并且易于升級,但是會難以部署。靜態(tài)庫與動態(tài)庫的比較動態(tài)庫只有在使用它的程序執(zhí)行時才被鏈接使gcc---警告選項(1)$gcc–ansiwarning.c–owarningwarning.c:在函數(shù)“main”中:warning.c:7警告:在無返回值的函數(shù)中,“return”帶返回值warning.c:4警告:“main”的返回類型不是“int”

gcc---警告選項(1)$gcc–ansiwargcc---警告選項(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---警告選項(2)$gcc–pedanticgcc---優(yōu)化選項gcc可以對代碼進(jìn)行優(yōu)化,它通過編譯選項“-On”來控制優(yōu)化代碼的生成,其中n是一個代表優(yōu)化級別的整數(shù)。不同的優(yōu)化級別對應(yīng)不同的優(yōu)化處理工作。如使用優(yōu)化選項“-O”主要進(jìn)行線程跳轉(zhuǎn)(ThreadJump)和延遲退棧(DeferredStackPops)兩種優(yōu)化。使用優(yōu)化選項“-O2”除了完成所有“-O1”級別的優(yōu)化之外,同時還要進(jìn)行一些額外的調(diào)整工作,如處理器指令調(diào)度等。選項“-O3”則還包括循環(huán)展開和其他一些與處理器特性相關(guān)的優(yōu)化工作。可能適合使用優(yōu)化選項的場合:程序發(fā)行不太適合使用優(yōu)化選項的場合:程序開發(fā)gcc---優(yōu)化選項gcc可以對代碼進(jìn)行優(yōu)化,它通過編譯gcc---體系結(jié)構(gòu)相關(guān)選項gcc---體系結(jié)構(gòu)相關(guān)選項1.4嵌入式LINUX調(diào)試器GDB的使用1.4嵌入式LINUX調(diào)試器GDB的使用gdb使用方法(1)gdb調(diào)試器是一款GNU開發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒有圖形化的友好界面,但是它強大的功能也足以與微軟的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è)置斷點與恢復(fù)命令gdb設(shè)置斷點與恢復(fù)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中源碼查看相關(guān)相關(guān)命令gdb中查看運行數(shù)據(jù)的相關(guān)命令gdb中查看運行數(shù)據(jù)的相關(guān)命令1.5MAKE工程管理器1.5MAKE工程管理器make工程管理器工程管理器,顧名思義,是指管理較多的文件Make工程管理器也就是個“自動編譯管理器”,這里的“自動”是指它能構(gòu)根據(jù)文件時間戳自動發(fā)現(xiàn)更新過的文件而減少編譯的工作量,同時,它通過讀入Makefile文件文件的內(nèi)容來執(zhí)行大量的編譯工作make工程管理器工程管理器,顧名思義,是指管理較多的文件makefile基本結(jié)構(gòu)(1)makefile是make讀入的惟一配置文件,因此本節(jié)的內(nèi)容實際就是講述makefile的編寫規(guī)則。在一個makefile中通常包含如下內(nèi)容:需要由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件;要創(chuàng)建的目標(biāo)體所依賴的文件(dependency_file);創(chuàng)建每個目標(biāo)體時需要運行的命令(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變量用來代替一個文本字符串變量定義的兩種方式遞歸展開方式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變量用來代替一個文本字符串OBJmakefile變量變量種類用戶自定義變量預(yù)定義變量自動變量環(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中常見的自動變量和環(huán)境變量make在啟動時會自動讀取系統(tǒng)當(dāng)前已經(jīng)定義了的環(huán)境變量,并且會創(chuàng)建與之具有相同名稱和數(shù)值的變量如果用戶在makefile中定義了相同名稱的變量,那么用戶自定義變量將會覆蓋同名的環(huán)境變量makefile中常見的自動變量和環(huán)境變量make在啟動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)用戶使用它們時就不必詳細(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等.壓縮文件請下載最新的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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論