




已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二章 Linux C編程基礎(chǔ)-make,GNU make管理項目,為什么要使用make? 工作量問題:對于擁有多個(上百個)源文件的軟件項目,只需編寫一次編譯過程,而不需要在每次源文件修改后重復(fù)輸入眾多的文件名和編譯命令進(jìn)行編譯; 效率問題:make能夠根據(jù)文件的時間戳自動發(fā)現(xiàn)更新過的源文件,并通過讀入Makefile文件來對更新的源文件進(jìn)行編譯而對其它文件只進(jìn)行鏈接操作。,2,makefile,makefile的格式: 目標(biāo):欲生成的目標(biāo)文件,通常是目標(biāo)文件或可執(zhí)行文件; 依賴項:生成目標(biāo)需要的文件,多個文件以空格隔開。 命令:創(chuàng)建每個目標(biāo)體時需要運(yùn)行的命令。可使用續(xù)行號()將一個單獨(dú)的命令行延續(xù)成幾行。 Makefile是make讀入的唯一配置文件,其中包含的規(guī)則指明編譯哪些文件以及怎樣編譯這些文件。,目標(biāo):依賴項列表 (Tab縮進(jìn))命令,makefile,Makefile示例,Makefile里有什么?,1、 顯式規(guī)則。 顯式規(guī)則說明了,如何生成一個或多的的目標(biāo)文件。 這是由Makefile的書寫者明顯指出,要生成的文件,文件的依賴文件,生成的命令。 2、隱式規(guī)則。由于我們的make有自動推導(dǎo)的功能,所以隱晦的規(guī)則可以讓我們比較粗糙地簡略地書寫Makefile,這是由make所支持的。 3、 變量的定義。 在Makefile中我們要定義一系列的變量,變量一般都是字符串,這個有點(diǎn)你C語言中的宏,當(dāng)Makefile被執(zhí)行時,其中的變量都會被擴(kuò)展到相應(yīng)的引用位置上。 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命令后面鍵入目標(biāo)名即可建立指定的目標(biāo);如果不跟目標(biāo)名則建立Makefile中定義的第一個目標(biāo)。 make -f file 讀入當(dāng)前目錄下的file文件作為Makefile;,Make工作原理,make做的工作: 在執(zhí)行g(shù)cc時會先檢查依賴文件是否存在: 若不存在就先執(zhí)行別的規(guī)則以生成缺少的依賴文件,最后生成相關(guān)的目標(biāo)文件。 如果存在,并不急于執(zhí)行g(shù)cc,而是先比較依賴文件與其對應(yīng)源文件的時間戳。如果源文件較新的話,就會執(zhí)行相應(yīng)的規(guī)則來重新生成依賴文件和目標(biāo)文件。否則就不會執(zhí)行相應(yīng)的gcc。,Make工作原理,1)如果工程沒有編譯過,那么所有C文件都要編譯并被鏈接。 2)如果這個工程的某幾個C文件被修改,那么只編譯被修改的C文件,并鏈接目標(biāo)程序。 3)如果這個工程的頭文件被改變了,那么需要編譯引用了這幾個頭文件的C文件,并鏈接目標(biāo)程序。,目標(biāo)的依賴關(guān)系,Makefile中的變量,變量的主要作用如下: 保存文件名列表:作為依賴文件的一些目標(biāo)文件名出現(xiàn)在可執(zhí)行文件的規(guī)則中,而在這個規(guī)則的命令行里同樣包含這些文件并傳遞給gcc做為命令參數(shù)。如果使用一個變量來保存所有的目標(biāo)文件名,則可以方便地加入新的目標(biāo)文件而且不易出錯。 保存可執(zhí)行命令名:如果項目被用在一個非gcc的系統(tǒng)里,則必須將所有出現(xiàn)編譯器名的地方改成用新的編譯器名。但是如果使用一個變量來代替編譯器名,那么只需要改變該變量的值。 保存編譯器的參數(shù):在很多源代碼編譯時,gcc需要很長的參數(shù)選項,在很多情況下,所有的編譯命令使用一組相同的選項,如果把這組選項使用一個變量代表,那么可以把這個變量放在所有引用編譯器的地方。當(dāng)要改變選項的時候,只需改變一次這個變量的內(nèi)容即可。,變量的定義和使用,Makefile中的變量是用一個文本串在Makefile中定義的,這個文本串就是變量的值。只要在一行的開始寫下這個變量的名字,后面跟一個“”號,以及要設(shè)定這個變量的值即可定義變量,下面是定義變量的語法: VARNAME=string 使用時,把變量用括號括起來,并在前面加上$符號,就可以引用變量的值: $VARNAME 變量一般都在Makefile的頭部定義。按照慣例,所有的Makefile變量都應(yīng)該是大寫。如果變量的值發(fā)生變化,就只需要在一個地方修改,從而簡化了Makefile的維護(hù)。,變量的其他定義方法:,x := foo y := $(x) bar,FOO ?= bar,+=:追加變量值,make命令,Makefile中變量的使用,變量的定義: OBJS = val,新Makefile文件內(nèi)容: OBJS = main.o hello.o CC = gcc -Wall -c main: $(OBJS) gcc $(OBJS) -o main main.o: main.c $(CC) main.c -o main.o hello.o: hello.c hello.h $(CC) hello.c -o hello.o,變量的使用: $(OBJS),Makefile文件內(nèi)容: main: main.o hello.o gcc main.o hello.o -o main main.o: main.c gcc -Wall -c main.c -o main.o hello.o: hello.c hello.h gcc -Wall -c hello.c -o hello.o,14,Makefile中常見自動變量,$* 不包含擴(kuò)展名的目標(biāo)文件名稱 $+ 所有的依賴文件,以空格分開,并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件 $ 第一個依賴文件的名稱 $? 所有時間戳比目標(biāo)文件晚的依賴文件,并 以空格分開 $ 目標(biāo)文件的完整名稱 $ 所有不重復(fù)的依賴文件,以空格分開,make命令,Makefile中常見的自動變量,Makefile文件內(nèi)容: OBJS = main.o hello.o CC = gcc -Wall -c main: $(OBJS) gcc $(OBJS) -o main main.o: main.c $(CC) main.c -o main.o hello.o: hello.c hello.h $(CC) hello.c -o hello.o,新Makefile文件內(nèi)容: OBJS = main.o hello.o CC = gcc -Wall -c main: $(OBJS) gcc $ -o $ main.o: main.c $(CC) $ -o $ hello.o: hello.c hello.h $(CC) $ -o $,16,Makefile中常見預(yù)定義變量,AR 歸檔維護(hù)程序的名稱,默認(rèn)值為ar AS 匯編程序的名稱,默認(rèn)值為as CC C編譯器的名稱,默認(rèn)值為cc CPP C預(yù)編譯器的名稱,默認(rèn)值為$(CC) E RM 文件刪除程序的名稱,默認(rèn)值為rm f ARFLAGS 庫文件維護(hù)程序的選項,無默認(rèn)值 ASFLAGS 傳給匯編程序的標(biāo)志,無默認(rèn)值 CFLAGS C編譯器的選項,無默認(rèn)值 CPPFLAGS C預(yù)編譯的選項,無默認(rèn)值,Makefile規(guī)則,1、隱式規(guī)則 隱式規(guī)則定義了將一個具有某個后綴的文件(例如,.c 文件)轉(zhuǎn)換為具有另外一種后綴的文件(例如,.o 文件)的方法。每個后綴規(guī)則以兩個成對出現(xiàn)的后綴名定義。 注意:在隱式規(guī)則只能查找到相同文件名的不同后綴名文件,如”file.o”文件必須由”file.c”文件生成。,例:,main: main.o hello.o gcc main.o hello.o -o main,main: main.o hello.o gcc main.o hello.o -o main main.o: main.c hello.h gcc -Wall -c main.c -o main.o hello.o: hello.c hello.h gcc -Wall -c hello.c -o hello.o,Makefile規(guī)則,2、模式規(guī)則 模式規(guī)則是用來定義相同處理規(guī)則的多個文件的。 隱式規(guī)則僅僅能夠用make默認(rèn)的變量來進(jìn)行操作,而模式規(guī)則還能引入用戶自定義變量,為多個文件建立相同的規(guī)則,從而簡化Makefile的編寫。 模式規(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三年級美術(shù)課程評價與反饋計劃
- 插班生入學(xué)協(xié)議及綜合素質(zhì)培養(yǎng)與綜合素質(zhì)評價合同
- 車輛抵押貸款合同違約責(zé)任免除協(xié)議書
- 車輛抵押權(quán)登記及抵押物處置專項合同
- 商業(yè)地產(chǎn)項目場地租賃分成管理協(xié)議
- 礦場資源股權(quán)并購與礦產(chǎn)資源開發(fā)及安全生產(chǎn)合作協(xié)議
- 停車場車位租賃及停車服務(wù)合同
- 城市綜合體場地使用權(quán)轉(zhuǎn)讓合同
- 財務(wù)顧問服務(wù)協(xié)議:公司上市與股權(quán)激勵方案設(shè)計
- 牛黃清火丸市場應(yīng)用分析-洞察闡釋
- 雇人包工免責(zé)協(xié)議書
- 船舶應(yīng)急部署表及船員應(yīng)變卡
- 2025年下半年山東能源集團(tuán)權(quán)屬企業(yè)內(nèi)蒙古榮信化工限公司社會招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 2025屆高三5月份全國各地聯(lián)考文言文閱讀分類匯編(解析版)
- 土建項目分包協(xié)議書
- 陜西郵政校招筆試題及答案
- 吐魯番市高昌區(qū)招聘社區(qū)工作者考試真題2024
- 山東省濟(jì)南市2025屆高三三模歷史試卷(含答案)
- 小學(xué)語文大單元整體教學(xué)設(shè)計講座
- 2025年中考道法答題技巧與模板構(gòu)建專題08主觀題答題技巧(觀點(diǎn)概括類試)(學(xué)生版+解析)
- 風(fēng)力發(fā)電場調(diào)試規(guī)程
評論
0/150
提交評論