資源描述:
《linuxc編程基礎(chǔ)--mak》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第二章LinuxC編程基礎(chǔ)--makeGNUmake管理項目為什么要使用make?工作量問題:對于擁有多個(上百個)源文件的軟件項目,只需編寫一次編譯過程,而不需要在每次源文件修改后重復(fù)輸入眾多的文件名和編譯命令進行編譯;效率問題:make能夠根據(jù)文件的時間戳自動發(fā)現(xiàn)更新過的源文件,并通過讀入Makefile文件來對更新的源文件進行編譯而對其它文件只進行鏈接操作。2makefilemakefile的格式:目標:欲生成的目標文件,通常是目標文件或可執(zhí)行文件;依賴項:生成目標需要的文件,多個文件以空格隔開。命令:創(chuàng)建每個目標體時需要運行的命令??墒褂美m(xù)行號()將一個
2、單獨的命令行延續(xù)成幾行。Makefile是make讀入的唯一配置文件,其中包含的規(guī)則指明make編譯哪些文件以及怎樣編譯這些文件。目標:依賴項列表(Tab縮進)命令makefileMakefile示例Makefile文件1my_app:greeting.omy_app.o2gccmy_app.ogreeting.o-omy_app3greeting.o:functions/greeting.cfunctions/greeting.h4gcc-cfunctions/greeting.c–Ifunctions5my_app.o:my_app.cfunctions/gr
3、eeting.h6gcc–cmy_app.c–IfunctionsMakefile里有什么?1、顯式規(guī)則。顯式規(guī)則說明了,如何生成一個或多的的目標文件。這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。2、隱式規(guī)則。由于我們的make有自動推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。3、變量的定義。在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點你C語言中的宏,當(dāng)Makefile被執(zhí)行時,其中的變量都會被擴展到相應(yīng)的引用位置上。4、文件指示。其包括了三個部
4、分,一個是在一個Makefile中引用另一個Makefile,就像C語言中的include一樣;另一個是指根據(jù)某些情況指定Makefile中的有效部分,就像C中的預(yù)編譯#if一樣;還有就是定義一個多行的命令。5、注釋。Makefile中只有行注釋,其注釋是用“#”字符。make命令make工具的使用格式:make[命令選項][命令參數(shù)]通常使用make就可以了,make會按序查找名為GNUmakefile、Makefile和makefile作為編譯指導(dǎo)文件;建議使用Makefile。在make命令后面鍵入目標名即可建立指定的目標;如果不跟目標名則建立Makefil
5、e中定義的第一個目標。make-ffile讀入當(dāng)前目錄下的file文件作為Makefile;Make工作原理make做的工作:在執(zhí)行g(shù)cc時會先檢查依賴文件是否存在:若不存在就先執(zhí)行別的規(guī)則以生成缺少的依賴文件,最后生成相關(guān)的目標文件。如果存在,并不急于執(zhí)行g(shù)cc,而是先比較依賴文件與其對應(yīng)源文件的時間戳。如果源文件較新的話,就會執(zhí)行相應(yīng)的規(guī)則來重新生成依賴文件和目標文件。否則就不會執(zhí)行相應(yīng)的gcc。Make工作原理1)如果工程沒有編譯過,那么所有C文件都要編譯并被鏈接。2)如果這個工程的某幾個C文件被修改,那么只編譯被修改的C文件,并鏈接目標程序。3)如果這個工
6、程的頭文件被改變了,那么需要編譯引用了這幾個頭文件的C文件,并鏈接目標程序。目標的依賴關(guān)系my_appmy_app.ogreeting.omy_app.cfunctionsgreeting.hfunctionsgreeting.cgcc–cmy_app.c–Ifunctionsgcc-cfunctionsgreeting.cgccmy_app.ogreeting.o-omy_appMakefile中的變量變量的主要作用如下:保存文件名列表:作為依賴文件的一些目標文件名出現(xiàn)在可執(zhí)行文件的規(guī)則中,而在這個規(guī)則的命令行里同樣包含這些文件并傳遞給gcc做為命令參數(shù)。
7、如果使用一個變量來保存所有的目標文件名,則可以方便地加入新的目標文件而且不易出錯。保存可執(zhí)行命令名:如果項目被用在一個非gcc的系統(tǒng)里,則必須將所有出現(xiàn)編譯器名的地方改成用新的編譯器名。但是如果使用一個變量來代替編譯器名,那么只需要改變該變量的值。保存編譯器的參數(shù):在很多源代碼編譯時,gcc需要很長的參數(shù)選項,在很多情況下,所有的編譯命令使用一組相同的選項,如果把這組選項使用一個變量代表,那么可以把這個變量放在所有引用編譯器的地方。當(dāng)要改變選項的時候,只需改變一次這個變量的內(nèi)容即可。變量的定義和使用Makefile中的變量是用一個文本串在Makefile中定義的,
8、這個文本串