亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? makefile編寫.txt

?? 關于ns使用技巧的大集
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
于是,我們可以寫出[.c]文件和[.d]文件的依賴關系,并讓make自動更新或自成[.d]文件

,并把其包含在我們的主Makefile中,這樣,我們就可以自動化地生成每個文件的依賴關

系了。 


這里,我們給出了一個模式規則來產生[.d]文件: 


%.d: %.c 

@set -e; rm -f $@; \ 

$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \ 

sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ 

rm -f $@.$$$$ 



這個規則的意思是,所有的[.d]文件依賴于[.c]文件,“rm -f $@”的意思是刪除所有的

目標,也就是[.d]文件,第二行的意思是,為每個依賴文件“$<”,也就是[.c]文件生成

依賴文件,“$@”表示模式“%.d”文件,如果有一個C文件是name.c,那么“%”就是“n

ame”,“$$$$”意為一個隨機編號,第二行生成的文件有可能是“name.d.12345”,第三

行使用sed命令做了一個替換,關于sed命令的用法請參看相關的使用文檔。第四行就是刪

除臨時文件。 


總而言之,這個模式要做的事就是在編譯器生成的依賴關系中加入[.d]文件的依賴,即把

依賴關系: 


main.o : main.c defs.h 


轉成: 


main.o main.d : main.c defs.h 


于是,我們的[.d]文件也會自動更新了,并會自動生成了,當然,你還可以在這個[.d]文

件中加入的不只是依賴關系,包括生成的命令也可一并加入,讓每個[.d]文件都包含一個

完賴的規則。一旦我們完成這個工作,接下來,我們就要把這些自動生成的規則放進我們

的主Makefile中。我們可以使用Makefile的“include”命令,來引入別的Makefile文件(

前面講過),例如: 


sources = foo.c bar.c 


include $(sources:.c=.d) 


上述語句中的“$(sources:.c=.d)”中的“.c=.d”的意思是做一個替換,把變量$(sourc

es)所有[.c]的字串都替換成[.d],關于這個“替換”的內容,在后面我會有更為詳細的講

述。當然,你得注意次序,因為include是按次來載入文件,最先載入的[.d]文件中的目標

會成為默認目標。 


書寫命令 

———— 


每條規則中的命令和操作系統Shell的命令行是一致的。make會一按順序一條一條的執行命

令,每條命令的開頭必須以[Tab]鍵開頭,除非,命令是緊跟在依賴規則后面的分號后的。

在命令行之間中的空格或是空行會被忽略,但是如果該空格或空行是以Tab鍵開頭的,那么

make會認為其是一個空命令。 


我們在UNIX下可能會使用不同的Shell,但是make的命令默認是被“/bin/sh”——UNIX的

標準Shell解釋執行的。除非你特別指定一個其它的Shell。Makefile中,“#”是注釋符,

很像C/C++中的“//”,其后的本行字符都被注釋。 


一、顯示命令 


通常,make會把其要執行的命令行在命令執行前輸出到屏幕上。當我們用“@”字符在命令

行前,那么,這個命令將不被make顯示出來,最具代表性的例子是,我們用這個功能來像

屏幕顯示一些信息。如: 


@echo 正在編譯XXX模塊...... 


當make執行時,會輸出“正在編譯XXX模塊......”字串,但不會輸出命令,如果沒有“@

”,那么,make將輸出: 


echo 正在編譯XXX模塊...... 

正在編譯XXX模塊...... 


如果make執行時,帶入make參數“-n”或“--just-print”,那么其只是顯示命令,但不

會執行命令,這個功能很有利于我們調試我們的Makefile,看看我們書寫的命令是執行起

來是什么樣子的或是什么順序的。 


而make參數“-s”或“--slient”則是全面禁止命令的顯示。 




二、命令執行 


當依賴目標新于目標時,也就是當規則的目標需要被更新時,make會一條一條的執行其后

的命令。需要注意的是,如果你要讓上一條命令的結果應用在下一條命令時,你應該使用

分號分隔這兩條命令。比如你的第一條命令是cd命令,你希望第二條命令得在cd之后的基

礎上運行,那么你就不能把這兩條命令寫在兩行上,而應該把這兩條命令寫在一行上,用

分號分隔。如: 


示例一: 

exec: 

cd /home/hchen 

pwd 


示例二: 

exec: 

cd /home/hchen; pwd 


當我們執行“make exec”時,第一個例子中的cd沒有作用,pwd會打印出當前的Makefile

目錄,而第二個例子中,cd就起作用了,pwd會打印出“/home/hchen”。 


make一般是使用環境變量SHELL中所定義的系統Shell來執行命令,默認情況下使用UNIX的

標準Shell——/bin/sh來執行命令。但在MS-DOS下有點特殊,因為MS-DOS下沒有SHELL環境

變量,當然你也可以指定。如果你指定了UNIX風格的目錄形式,首先,make會在SHELL所指

定的路徑中找尋命令解釋器,如果找不到,其會在當前盤符中的當前目錄中尋找,如果再

找不到,其會在PATH環境變量中所定義的所有路徑中尋找。MS-DOS中,如果你定義的命令

解釋器沒有找到,其會給你的命令解釋器加上諸如“.exe”、“.com”、“.bat”、“.s

h”等后綴。 




三、命令出錯 


每當命令運行完后,make會檢測每個命令的返回碼,如果命令返回成功,那么make會執行

下一條命令,當規則中所有的命令成功返回后,這個規則就算是成功完成了。如果一個規

則中的某個命令出錯了(命令退出碼非零),那么make就會終止執行當前規則,這將有可

能終止所有規則的執行。 


有些時候,命令的出錯并不表示就是錯誤的。例如mkdir命令,我們一定需要建立一個目錄

,如果目錄不存在,那么mkdir就成功執行,萬事大吉,如果目錄存在,那么就出錯了。我

們之所以使用mkdir的意思就是一定要有這樣的一個目錄,于是我們就不希望mkdir出錯而

終止規則的運行。 


為了做到這一點,忽略命令的出錯,我們可以在Makefile的命令行前加一個減號“-”(在

Tab鍵之后),標記為不管命令出不出錯都認為是成功的。如: 


clean: 

-rm -f *.o 


還有一個全局的辦法是,給make加上“-i”或是“--ignore-errors”參數,那么,Makef

ile中所有命令都會忽略錯誤。而如果一個規則是以“.IGNORE”作為目標的,那么這個規

則中的所有命令將會忽略錯誤。這些是不同級別的防止命令出錯的方法,你可以根據你的

不同喜歡設置。 


還有一個要提一下的make的參數的是“-k”或是“--keep-going”,這個參數的意思是,

如果某規則中的命令出錯了,那么就終目該規則的執行,但繼續執行其它規則。 




四、嵌套執行make 


在一些大的工程中,我們會把我們不同模塊或是不同功能的源文件放在不同的目錄中,我

們可以在每個目錄中都書寫一個該目錄的Makefile,這有利于讓我們的Makefile變得更加

地簡潔,而不至于把所有的東西全部寫在一個Makefile中,這樣會很難維護我們的Makefi

le,這個技術對于我們模塊編譯和分段編譯有著非常大的好處。 


例如,我們有一個子目錄叫subdir,這個目錄下有個Makefile文件,來指明了這個目錄下

文件的編譯規則。那么我們總控的Makefile可以這樣書寫: 


subsystem: 

cd subdir && $(MAKE) 


其等價于: 


subsystem: 

$(MAKE) -C subdir 


定義$(MAKE)宏變量的意思是,也許我們的make需要一些參數,所以定義成一個變量比較利

于維護。這兩個例子的意思都是先進入“subdir”目錄,然后執行make命令。 


我們把這個Makefile叫做“總控Makefile”,總控Makefile的變量可以傳遞到下級的Make

file中(如果你顯示的聲明),但是不會覆蓋下層的Makefile中所定義的變量,除非指定

了“-e”參數。 


如果你要傳遞變量到下級Makefile中,那么你可以使用這樣的聲明: 


export <variable ...> 


如果你不想讓某些變量傳遞到下級Makefile中,那么你可以這樣聲明: 


unexport <variable ...> 


如: 


示例一: 


export variable = value 


其等價于: 


variable = value 

export variable 


其等價于: 


export variable := value 


其等價于: 


variable := value 

export variable 


示例二: 


export variable += value 


其等價于: 


variable += value 

export variable 


如果你要傳遞所有的變量,那么,只要一個export就行了。后面什么也不用跟,表示傳遞

所有的變量。 


需要注意的是,有兩個變量,一個是SHELL,一個是MAKEFLAGS,這兩個變量不管你是否ex

port,其總是要傳遞到下層Makefile中,特別是MAKEFILES變量,其中包含了make的參數信

息,如果我們執行“總控Makefile”時有make參數或是在上層Makefile中定義了這個變量

,那么MAKEFILES變量將會是這些參數,并會傳遞到下層Makefile中,這是一個系統級的環

境變量。 


但是make命令中的有幾個參數并不往下傳遞,它們是“-C”,“-f”,“-h”“-o”和“-W

”(有關Makefile參數的細節將在后面說明),如果你不想往下層傳遞參數,那么,你可

以這樣來: 


subsystem: 

cd subdir && $(MAKE) MAKEFLAGS= 


如果你定義了環境變量MAKEFLAGS,那么你得確信其中的選項是大家都會用到的,如果其中

有“-t”,“-n”,和“-q”參數,那么將會有讓你意想不到的結果,或許會讓你異常地恐

慌。 


還有一個在“嵌套執行”中比較有用的參數,“-w”或是“--print-directory”會在mak

e的過程中輸出一些信息,讓你看到目前的工作目錄。比如,如果我們的下級make目錄是“

/home/hchen/gnu/make”,如果我們使用“make -w”來執行,那么當進入該目錄時,我們

會看到: 


make: Entering directory `/home/hchen/gnu/make'. 


而在完成下層make后離開目錄時,我們會看到: 


make: Leaving directory `/home/hchen/gnu/make' 


當你使用“-C”參數來指定make下層Makefile時,“-w”會被自動打開的。如果參數中有

“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”總是失效的。 






五、定義命令包 


如果Makefile中出現一些相同命令序列,那么我們可以為這些相同的命令序列定義一個變

量。定義這種命令序列的語法以“define”開始,以“endef”結束,如: 


define run-yacc 

yacc $(firstword $^) 

mv y.tab.c $@ 

endef 


這里,“run-yacc”是這個命令包的名字,其不要和Makefile中的變量重名。在“define

”和“endef”中的兩行就是命令序列。這個命令包中的第一個命令是運行Yacc程序,因為

Yacc程序總是生成“y.tab.c”的文件,所以第二行的命令就是把這個文件改改名字。還是

把這個命令包放到一個示例中來看看吧。 


foo.c : foo.y 

$(run-yacc) 


我們可以看見,要使用這個命令包,我們就好像使用變量一樣。在這個命令包的使用中,

命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”(有關這種以“$”

開頭的特殊變量,我們會在后面介紹),make在執行命令包時,命令包中的每個命令會被

依次獨立執行。 


使用變量 

———— 


在Makefile中的定義的變量,就像是C/C++語言中的宏一樣,他代表了一個文本字串,在M

akefile中執行的時候其會自動原模原樣地展開在所使用的地方。其與C/C++所不同的是,

你可以在Makefile中改變其值。在Makefile中,變量可以使用在“目標”,“依賴目標”

,“命令”或是Makefile的其它部分中。 


變量的命名字可以包含字符、數字,下劃線(可以是數字開頭),但不應該含有“:”、“

#”、“=”或是空字符(空格、回車等)。變量是大小寫敏感的,“foo”、“Foo”和“

FOO”是三個不同的變量名。傳統的Makefile的變量名是全大寫的命名方式,但我推薦使用

大小寫搭配的變量名,如:MakeFlags。這樣可以避免和系統的變量沖突,而發生意外的事

情。 


有一些變量是很奇怪字串,如“$<”、“$@”等,這些是自動化變量,我會在后面介紹。



一、變量的基礎 


變量在聲明時需要給予初值,而在使用時,需要給在變量名前加上“$”符號,但最好用小

括號“()”或是大括號“{}”把變量給包括起來。如果你要使用真實的“$”字符,那么

你需要用“$$”來表示。 


變量可以使用在許多地方,如規則中的“目標”、“依賴”、“命令”以及新的變量中。

先看一個例子: 


objects = program.o foo.o utils.o 

program : $(objects) 

cc -o program $(objects) 


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产福利精品一区| 国产精品的网站| 日韩欧美你懂的| 国产大陆亚洲精品国产| 欧美午夜精品久久久| 国内精品国产三级国产a久久| 中文字幕日本乱码精品影院| 国产精品理论片| 久99久精品视频免费观看| 亚洲福利国产精品| 一区二区在线观看免费视频播放| 国产精品成人免费精品自在线观看 | 精品国产一区二区三区久久影院| 欧美绝品在线观看成人午夜影视| 在线观看国产日韩| 一本色道久久综合亚洲91 | 欧美精三区欧美精三区| 亚洲精品老司机| 99精品视频中文字幕| 91浏览器在线视频| 91久久人澡人人添人人爽欧美| 欧美日韩在线播放三区四区| 日韩欧美一区中文| 欧美激情在线看| 亚洲日本在线视频观看| 视频一区二区三区在线| 精彩视频一区二区三区| 日韩欧美国产综合一区| 日本人妖一区二区| 成人av午夜影院| 欧美性大战久久久久久久 | 国内精品久久久久影院色| 欧美日韩不卡视频| 日本一区二区免费在线观看视频 | 国产欧美视频一区二区三区| 国产在线看一区| 久久久久久久性| 亚洲综合免费观看高清在线观看| 欧美aaaaaa午夜精品| 成人av电影在线| 亚洲精品乱码久久久久久| 99精品一区二区| 亚洲激情男女视频| 日本久久精品电影| 午夜精品久久久久久久99樱桃| 亚洲chinese男男1069| 精品一区精品二区高清| 精品电影一区二区三区| 国产成人免费视频网站| 中文字幕一区二区三区精华液| 在线一区二区三区四区五区 | 91官网在线免费观看| 亚洲.国产.中文慕字在线| 51精品国自产在线| 一区二区三区 在线观看视频| 精品一区二区三区久久久| 亚洲精品一区二区三区精华液| 福利电影一区二区| 久久嫩草精品久久久精品一| 成人免费视频国产在线观看| 久久综合九色综合久久久精品综合| 亚洲一区二区欧美| 精品日本一线二线三线不卡| 婷婷开心激情综合| 国产亲近乱来精品视频| 在线一区二区三区做爰视频网站| 麻豆精品一区二区| 欧美在线色视频| 国产一区二区在线看| 欧美一级精品大片| av中文一区二区三区| 国产日产欧美精品一区二区三区| 在线视频观看一区| 国产一区福利在线| 亚洲成av人片一区二区梦乃| 国产女主播一区| 欧美一区二区精品| 青青草一区二区三区| 最好看的中文字幕久久| 久久亚洲精精品中文字幕早川悠里| 色婷婷av一区二区| 国产成人高清在线| 秋霞影院一区二区| 亚洲精品一卡二卡| 国产日产欧美一区| 日韩久久久精品| 欧美久久久久免费| 色偷偷久久一区二区三区| 国产精品性做久久久久久| 久久一夜天堂av一区二区三区| 色av成人天堂桃色av| 大胆亚洲人体视频| 激情伊人五月天久久综合| 亚洲成人高清在线| 亚洲伦理在线精品| 国产欧美综合在线观看第十页| 欧美一区二区三区日韩| 99re这里只有精品视频首页| 国产成人av一区二区三区在线观看| 日本成人在线不卡视频| 亚洲国产综合人成综合网站| 亚洲欧美福利一区二区| 欧美日韩在线播放三区四区| 91美女视频网站| 色综合婷婷久久| 美国十次了思思久久精品导航| 亚洲综合丁香婷婷六月香| 最新久久zyz资源站| 精品国产免费一区二区三区四区| 欧美日韩一级大片网址| 欧美视频在线一区二区三区 | 日韩三区在线观看| 91精品久久久久久久91蜜桃| 6080国产精品一区二区| 欧美片在线播放| 91精品国模一区二区三区| 在线播放国产精品二区一二区四区| 欧美性猛片aaaaaaa做受| 欧美综合色免费| 欧美三级电影网| 51午夜精品国产| 精品国产免费人成电影在线观看四季 | 欧美综合色免费| 91.com视频| 日韩精品一区二区三区中文不卡| 日韩精品一区二区三区视频播放 | zzijzzij亚洲日本少妇熟睡| 懂色av中文一区二区三区| 91最新地址在线播放| 欧美亚洲国产一卡| 欧美一区国产二区| 日韩欧美一级二级三级久久久| 精品国产伦理网| 中文字幕av一区二区三区免费看| 中文字幕中文在线不卡住| 一区二区三区小说| 青青草国产精品97视觉盛宴| 国产一区中文字幕| 91视频你懂的| 日韩一级免费观看| 久久影视一区二区| 一区二区三区四区在线| 日韩和欧美的一区| 国产98色在线|日韩| 在线视频你懂得一区| 2023国产一二三区日本精品2022| 国产精品久久久久婷婷二区次| 亚洲第一电影网| 国产精品18久久久久久vr| 色综合久久综合| 久久亚区不卡日本| 一区二区三区在线视频播放| 国产在线精品免费| 欧美性猛交xxxxxxxx| 欧美激情一区二区| 日韩国产在线观看一区| 成人app网站| 日韩欧美国产wwwww| 亚洲欧美激情小说另类| 韩国一区二区三区| 欧美日韩三级一区二区| 久久精品视频网| 久久久亚洲精品一区二区三区| 亚洲色大成网站www久久九九| 免费观看成人av| 91麻豆免费看片| 久久亚区不卡日本| 日本三级韩国三级欧美三级| 色国产综合视频| 日本一区二区三区四区在线视频| 天堂一区二区在线| 99视频热这里只有精品免费| 精品日韩一区二区三区| 午夜欧美电影在线观看| aaa亚洲精品一二三区| 欧美一级欧美一级在线播放| 亚洲精品免费视频| www.66久久| 国产欧美精品区一区二区三区| 男女男精品视频网| 欧美性极品少妇| 一区二区高清在线| 99精品欧美一区| 国产精品区一区二区三区| 国产精品免费av| 韩国在线一区二区| 精品国产亚洲在线| 老司机免费视频一区二区三区| 精品一区二区三区免费观看 | 欧美无乱码久久久免费午夜一区| 成人免费一区二区三区在线观看| 国产精品一卡二卡在线观看| 欧美成人r级一区二区三区| 青青草原综合久久大伊人精品优势| 欧美三级中文字幕| 亚洲香肠在线观看| 欧美色图激情小说| 午夜精品福利在线| 欧美一区二区视频在线观看| 男女男精品视频网|