計算機軟件及應(yīng)用04gccmakefile.pptx_第1頁
計算機軟件及應(yīng)用04gccmakefile.pptx_第2頁
計算機軟件及應(yīng)用04gccmakefile.pptx_第3頁
計算機軟件及應(yīng)用04gccmakefile.pptx_第4頁
計算機軟件及應(yīng)用04gccmakefile.pptx_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Gcc & makefile大綱Gcc基礎(chǔ)Gdb基礎(chǔ)Makefile基礎(chǔ)(基本語法,變量,函數(shù))靜態(tài)鏈接庫和動態(tài)鏈接庫makefile的編寫使用GNU cc開發(fā)應(yīng)用程序 使用GNU cc 1gcc的簡介 gcc可以使程序員靈活地控制編譯過程。編譯過程一般可以分為下面四個階段,每個階段分別調(diào)用不同的工具進行處理,如圖9-18所示。 預(yù)處理鏈接編譯組譯源程序(*.c)可執(zhí)行文件預(yù)處理器編譯器組譯器連接器3gcc的使用 gcc的使用格式如下:$ gcc optionsfilenames其中filenames為所要編譯的程序源文件。 當(dāng)使用gcc時,gcc會完成預(yù)處理、編譯、匯編和連接。前三步分別生成

2、目標文件,連接時,把生成的目標文件鏈接成可執(zhí)行文件。無論是C、C+、還是pas,首先要把源文件編譯成中間代碼文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,這個動作叫做編譯(compile)。然后再把大量的Object File合成執(zhí)行文件,這個動作叫作鏈接(link)。編譯時,編譯器需要的是語法的正確,函數(shù)與變量的聲明的正確。 對于后者,通常是需要告訴編譯器頭文件的所在位置(頭文件中應(yīng)該只是聲明,而定義應(yīng)該放在C/C+文件中) 只要所有的語法正確,編譯器就可以編譯出中間目標文件。一般來說,每個源文件都應(yīng)該對應(yīng)于一個中間目標文件(O文件或是

3、OBJ文件)。鏈接時,主要是鏈接函數(shù)和全局變量,可以使用中間目標文件(O文件或是OBJ文件)來鏈接應(yīng)用程序。 鏈接器并不管函數(shù)所在的源文件,只管函數(shù)的中間目標文件(Object File),在大多數(shù)時候,由于源文件太多,編譯生成的中間目標文件太多,而在鏈接時需要明顯地指出中間目標文件名,這對于編譯很不方便,所以要給中間目標文件打個包,在Windows下這種包叫“庫文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。總結(jié)一下源文件首先會生成中間目標文件,再由中間目標文件生成執(zhí)行文件。在編譯時,編譯器只檢測程序語法,和函數(shù)、變量

4、是否被聲明。如果函數(shù)未被聲明,編譯器會給出一個警告,但可以生成Object File。而在鏈接程序時,鏈接器會在所有的Object File中找尋函數(shù)的實現(xiàn),如果找不到,那到就會報鏈接錯誤碼(Linker Error.makefile文件的作用 makefile文件保存了編譯器和連接器的參數(shù)選項,還表述了所有源文件之間的關(guān)系(源代碼文件需要的特定的包含文件,可執(zhí)行文件要求包含的目標文件模塊及庫等).Makefile文件工作原理創(chuàng)建程序(make程序)首先讀取makefile文件,然后再激活編譯器,匯編器,資源編譯器和連接器以便產(chǎn)生最后的輸出最后輸出并生成的通常是可執(zhí)行文件.創(chuàng)建程序利用內(nèi)置的推

5、理規(guī)則來激活編譯器,以便通過對特定CPP文件的編譯來產(chǎn)生特定的OBJ文件.一個Makefile文件主要含有一系列的規(guī)則,每條規(guī)則包含以下內(nèi)容。一個目標(target),即make最終需要創(chuàng)建的文件,如可執(zhí)行文件和目標文件;目標也可以是要執(zhí)行的動作,如“clean”。一個或多個依賴文件(dependency)列表,通常是編譯目標文件所需要的其他文件。 一系列命今(command),是make執(zhí)行的動作,通常是把指定的相關(guān)文件編譯成目標文件的編譯命令,每個命令占一行,且每個命令行的起始字符必須為TAB字符。 makefile文件的基本結(jié)構(gòu) Makefile規(guī)則的一般形式如下:target:depe

6、ndency1 dependency2 (tab)target是需要創(chuàng)建的二進制文件或目標文件dependency是在創(chuàng)建target時需要用到的一個或多個文件的列表command命令序列是創(chuàng)建target文件所需要執(zhí)行的步驟,比如編譯命令。 # 一個簡單的Makefile的例子# 以#開頭的為注釋行test:prog.o code.ogcc o test prog.o code.oprog.o:prog.c prog.h code.hgcc c prog.c o prog.ocode.o:code.c code.hgcc c code.c o code.oclean:rm f *.o Mak

7、efile里有什么?Makefile里主要包含了五個東西:顯式規(guī)則、隱晦規(guī)則、變量定義、文件指示和注釋。1、顯式規(guī)則。顯式規(guī)則說明了,如何生成一個或多的的目標文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。2、隱晦規(guī)則。由于我們的make有自動推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。3、變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點像C語言中的宏,當(dāng)Makefile被執(zhí)行時,其中的變量都會被擴展到相應(yīng)的引用位置上。Makefile里有什么?4、文件指示。其包括

8、了三個部分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣。5、注釋。Makefile中只有行注釋,和UNIX的Shell腳本一樣,其注釋是用“#”字符,這個就像C/C+中的“/”一樣。如果要在你的Makefile中使用“#”字符,可以用反斜框進行轉(zhuǎn)義,如:“/#”。最后,還值得一提的是,在Makefile中的命令,必須要以Tab鍵開始。Makefile中的變量是用一個文本串在Makefile中定義的,這個文本串就是變量的值。只要在一行的開始寫下這個變量的名字,后面跟一個“”號,以及要設(shè)定這個變量的值即可定義變量,下面是定義變量的語法:VARNAME

9、=string使用時,把變量用括號括起來,并在前面加上$符號,就可以引用變量的值: $VARNAME make解釋規(guī)則時,VARNAME在等式右端展開為定義它的字符串。變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應(yīng)該是大寫。如果變量的值發(fā)生變化,就只需要在一個地方修改,從而簡化了Makefile的維護。 Makefile中的變量現(xiàn)在利用變量把前面的Makefile重寫一遍:OBJS=prog.o code.oCC=gcctest:$ OBJS $ CC o test $ OBJS prog.o:prog.c prog.h code.h$ CC c prog.c

10、 o prog.ocode.o:code.c code.h$ CC c code.c o code.oclean:rm f *.o 除用戶自定義的變量外,make還允許使用環(huán)境變量、自動變量和預(yù)定義變量。使用環(huán)境變量的方法很簡單,在make啟動時,make讀取系統(tǒng)當(dāng)前已定義的環(huán)境變量,并且創(chuàng)建與之同名同值的變量,因此用戶可以像在shell中一樣在Makefile中方便的引用環(huán)境變量。模式規(guī)則模式規(guī)則中,至少在規(guī)則的目標定義中要包含%,否則,就是一般的規(guī)則。目標中的“%”定義表示對文件名的匹配,“%”表示長度任意的非空字符串?!?.c”表示以“.c”結(jié)尾的文件名(文件名的長度至少為3)而s.%.

11、c則表示以s.開頭,.c結(jié)尾的文件名(文件名的長度至少為5)。如果%定義在目標中,那么,目標中的%的值決定了依賴目標中的%的值,也就是說,目標中的模式的%決定了依賴目標中%的樣子。例如有一個模式規(guī)則如下:%.o : %.c ; 其含義是,指出了怎么從所有的.c文件生成相應(yīng)的.o文件的規(guī)則。如果要生成的目標是a.o b.o,那么%c就是a.c b.c。模式規(guī)則示例下面這個例子表示了,把所有的.c文件都編譯成.o文件.%.o : %.c$(CC) -c $(CFLAGS) $(CPPFLAGS) $ -o $其中,“$”表示所有的目標的每個值,$表示了所有依賴目標的挨個值。這些奇怪的變量叫自動化變

12、量,模式規(guī)則示例下面的這個例子中有兩個目標是模式的:%.tab.c %.tab.h: %.ybison -d $這條規(guī)則告訴make把所有的.y文件都以bison d .y執(zhí)行,然后生成.tab.c和.tab.h文件。(其中,表示一個任意字符串)。如果執(zhí)行程序foo依賴于文件parse.tab.o和scan.o,并且文件scan.o依賴于文件“parse.tab.h,如果parse.y文件被更新了,那么根據(jù)上述的規(guī)則,bison d parse.y就會被執(zhí)行一次,于是,parse.tab.o和scan.o的依賴文件就齊了。自動化變量在上述的模式規(guī)則中,目標和依賴文件都是一系例的文件,那么我們?nèi)?/p>

13、何書寫一個命令來完成從不同的依賴文件生成相應(yīng)的目標?因為在每一次的對模式規(guī)則的解析時,都會是不同的目標和依賴文件。自動化變量就是完成這個功能的。在前面,我們已經(jīng)對自動化變量有所提涉,相信你看到這里已對它有一個感性認識了。所謂自動化變量,就是這種變量會把模式中所定義的一系列的文件自動地挨個取出,直至所有的符合模式的文件都取完了。這種自動化變量只應(yīng)出現(xiàn)在規(guī)則的命令中。自動化變量下面是所有的自動化變量及其說明:$表示規(guī)則中的目標文件集。在模式規(guī)則中,如果有多個目標,那么,$就是匹配于目標中模式定義的集合。$%僅當(dāng)目標是函數(shù)庫文件中,表示規(guī)則中的目標成員名。例如,如果一個目標是foo.a(bar.o)

14、,那么,$%就是bar.o,$就是foo.a。如果目標不是函數(shù)庫文件(Unix下是.a,Windows下是.lib),那么,其值為空。$依賴目標中的第一個目標名字。如果依賴目標是以模式(即%)定義的,那么$將是符合模式的一系列的文件集。注意,其是一個一個取出來的。$?所有比目標新的依賴目標的集合。以空格分隔。$所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復(fù)的,那個這個變量會去除重復(fù)的依賴目標,只保留一份。例子TARGET=helloworldCC=gccCFLAGS=-Wall -O -gSRC=$(wildcard *.c)OBJS=$(patsubst %.c,%.o,$(w

15、ildcard *.c)$(TARGET):$(OBJS)$(CC) $(CFLAGS) $(OBJS) -o $# $(RM) *.o%.o: %.c$(CC) $(CFLAGS) -c $ -o $clean:rm -rf *.o helloworld Makefile中的變量替換1、wildcard : 擴展通配符2、notdir : 去除路徑3、patsubst :替換通配符 Makefile中的變量替換建立一個簡單的makefilesrc=$(wildcard *.c ./sub/*.c)dir=$(notdir $(src)obj=$(patsubst %.c,%.o,$(dir)

16、 ) all: echo $(src) echo $(dir) echo $(obj) echo endMakefile中的變量替換建立一個簡單的makefilesrc=$(wildcard *.c ./sub/*.c)第一行輸出:a.c b.c ./sub/sa.c ./sub/sb.c wildcard把 指定目錄 ./ 和 ./sub/ 下的所有后綴是c的文件全部展開。 Makefile中的變量替換dir=$(notdir $(src)第二行輸出:a.c b.c sa.c otdir把展開的文件去除掉路徑信息 Makefile中的變量替換obj=$(patsubst %.c,%.o,$(dir) ) 第三行輸出:a.o b.o sa.o sb.o 在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的變量符合后綴是.c的全部替換成.o例1例2例2linux下編譯自己的庫文件實踐 inux下文件的類型是不依賴于其后綴名的,但一般來講:.o,是目標文件,相當(dāng)于windows中的.obj文件.so 為共享庫,是shared object,用于動態(tài)連接的,和dll差不多.a為靜態(tài)庫,是好多個.o合在一起,用于靜態(tài)連接1.創(chuàng)建靜態(tài).

溫馨提示

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

最新文檔

評論

0/150

提交評論