<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux下C編程基礎之:make工程管理器

Linux下C編程基礎之:make工程管理器

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏


本文引用地址:http://dyxdggzs.com/article/257149.htm

3.5

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

到此為止,讀者已經(jīng)了解了如何在下使用編輯器編寫(xiě)代碼,如何使用gcc把代碼編譯成可執行文件,還學(xué)習了如何使用gdb來(lái)調試程序,那么,所有的工作看似已經(jīng)完成了,為什么還需要make這個(gè)工程管理器呢?


所謂工程管理器,顧名思義,是用于管理較多的文件。讀者可以試想一下,由成百上千個(gè)文件構成的項目,如果其中只有一個(gè)或少數幾個(gè)文件進(jìn)行了修改,按照之前所學(xué)的gcc編譯工具,就不得不把這所有的文件重新編譯一遍,因為編譯器并不知道哪些文件是最近更新的,而只知道需要包含這些文件才能把源代碼編譯成可執行文件,于是,程序員就不得不重新輸入數目如此龐大的文件名以完成最后的編譯工作。


編譯過(guò)程分為編譯、匯編、鏈接階段,其中編譯階段僅檢查語(yǔ)法錯誤以及函數與變量是否被正確地聲明了,在鏈接階段則主要完成函數鏈接和全局變量的鏈接。因此,那些沒(méi)有改動(dòng)的源代碼根本不需要重新編譯,而只要把它們重新鏈接進(jìn)去就可以了。所以,人們就希望有一個(gè)工程管理器能夠自動(dòng)識別更新了的文件代碼,而不需要重復輸入冗長(cháng)的命令行,這樣,就應運而生了。


實(shí)際上,也就是個(gè)“自動(dòng)編譯管理器”,這里的“自動(dòng)”是指它能夠根據文件時(shí)間戳自動(dòng)發(fā)現更新過(guò)的文件而減少編譯的工作量,同時(shí),它通過(guò)讀入makefile文件的內容來(lái)執行大量的編譯工作。用戶(hù)只需編寫(xiě)一次簡(jiǎn)單的編譯語(yǔ)句就可以了。它大大提高了實(shí)際項目的工作效率,而且幾乎所有下的項目編程均會(huì )涉及它,希望讀者能夠認真學(xué)習本節內容。


3.5.1makefile基本結構

makefile是make讀入的惟一配置文件,因此本節的內容實(shí)際就是講述makefile的編寫(xiě)規則。在一個(gè)makefile中通常包含如下內容:

n 需要由make工具創(chuàng )建的目標體(target),通常是目標文件或可執行文件;

n 要創(chuàng )建的目標體所依賴(lài)的文件(dependency_file);

n 創(chuàng )建每個(gè)目標體時(shí)需要運行的命令(command),這一行必須以制表符(tab鍵)開(kāi)頭。

它的格式為:


target:dependency_files

command/*該行必須以tab鍵開(kāi)頭*/


例如,有兩個(gè)文件分別為hello.c和hello.h,創(chuàng )建的目標體為hello.o,執行的命令為gcc編譯指令:gcc–chello.c,那么,對應的makefile就可以寫(xiě)為:


#Thesimplestexample

hello.o:hello.chello.h

gcc–chello.c–ohello.o


接著(zhù)就可以使用make了。使用make的格式為:maketarget,這樣make就會(huì )自動(dòng)讀入makefile(也可以是首字母大寫(xiě)的)并執行對應target的command語(yǔ)句,并會(huì )找到相應的依賴(lài)文件。如下所示:


[root@localhostmakefile]#makehello.o

gcc–chello.c–ohello.o

[root@localhostmakefile]#ls

hello.chello.hhello.omakefile


可以看到,makefile執行了“hello.o”對應的命令語(yǔ)句,并生成了“hello.o”目標體。


注意

在makefile中的每一個(gè)command前必須有“Tab”符,否則在運行make命令時(shí)會(huì )出錯。


3.5.2makefile變量

上面示例的makefile在實(shí)際中是幾乎不存在的,因為它過(guò)于簡(jiǎn)單,僅包含兩個(gè)文件和一個(gè)命令,在這種情況下完全不必要編寫(xiě)makefile而只需在shell中直接輸入即可,在實(shí)際中使用的makefile往往是包含很多的文件和命令的,這也是makefile產(chǎn)生的原因。下面就可給出稍微復雜一些的makefile進(jìn)行講解。


david:kang.oyul.o

gcckang.obar.o-omyprog

kang.o:kang.ckang.hhead.h

gcc–Wall–O-g–ckang.c-okang.o

yul.o:bar.chead.h

gcc-Wall–O-g–cyul.c-oyul.o


在這個(gè)makefile中有3個(gè)目標體(target),分別為david、kang.o和yul.o,其中第一個(gè)目標體的依賴(lài)文件就是后兩個(gè)目標體。如果用戶(hù)使用命令“makedavid”,則make管理器就是找到david目標體開(kāi)始執行。


這時(shí),make會(huì )自動(dòng)檢查相關(guān)文件的時(shí)間戳。首先,在檢查“kang.o”、“yul.o”和“david”3個(gè)文件的時(shí)間戳之前,它會(huì )向下查找那些把“kang.o”或“yul.o”作為目標文件的時(shí)間戳。比如,“kang.o”的依賴(lài)文件為“kang.c”、“kang.h”、“head.h”。如果這些文件中任何一個(gè)的時(shí)間戳比“kang.o”新,則命令“gcc–Wall–O-g–ckang.c-okang.o”將會(huì )執行,從而更新文件“kang.o”。在更新完“kang.o”或“yul.o”之后,make會(huì )檢查最初的“kang.o”、“yul.o”和“david”3個(gè)文件,只要文件“kang.o”或“yul.o”中的至少有一個(gè)文件的時(shí)間戳比“david”新,則第二行命令就會(huì )被執行。這樣,make就完成了自動(dòng)檢查時(shí)間戳的工作,開(kāi)始執行編譯工作。這也就是make工作的基本流程。


接下來(lái),為了進(jìn)一步簡(jiǎn)化編輯和維護makefile,make允許在makefile中創(chuàng )建和使用變量。變量是在makefile中定義的名字,用來(lái)代替一個(gè)文本字符串,該文本字符串稱(chēng)為該變量的值。在具體要求下,這些值可以代替目標體、依賴(lài)文件、命令以及makefile文件中其他部分。在makefile中的變量定義有兩種方式:一種是遞歸展開(kāi)方式,另一種是簡(jiǎn)單方式。


遞歸展開(kāi)方式定義的變量是在引用該變量時(shí)進(jìn)行替換的,即如果該變量包含了對其他變量的引用,則在引用該變量時(shí)一次性將內嵌的變量全部展開(kāi),雖然這種類(lèi)型的變量能夠很好地完成用戶(hù)的指令,但是它也有嚴重的缺點(diǎn),如不能在變量后追加內容(因為語(yǔ)句:CFLAGS=$(CFLAGS)-O在變量擴展過(guò)程中可能導致無(wú)窮循環(huán))。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程



上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>