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

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

?? makefile編寫.txt

?? 關于ns使用技巧的大集
?? TXT
?? 第 1 頁 / 共 5 頁
字號:

上面這個例子說明了通配符也可以在我們的規則中,目標print依賴于所有的[.c]文件 


。其中的“$?”是一個自動化變量,我會在后面給你講述。 


objects = *.o 


上面這個例子,表示了,通符同樣可以用在變量中。并不是說[*.o]會展開,不!obj 

ects的值就是“*.o”。Makefile中的變量其實就是C/C++中的宏。如果你要讓通配符在變

量中展開,也就是讓objects的值是所有[.o]的文件名的集合,那么,你可以這樣: 


objects := $(wildcard *.o) 


這種用法由關鍵字“wildcard”指出,關于Makefile的關鍵字,我們將在后面討論。 



四、文件搜尋 


在一些大的工程中,有大量的源文件,我們通常的做法是把這許多的源文件分類,并存放

在不同的目錄中。所以,當make需要去找尋文件的依賴關系時,你可以在文件前加上路徑

,但最好的方法是把一個路徑告訴make,讓make在自動去找。 


Makefile文件中的特殊變量“VPATH”就是完成這個功能的,如果沒有指明這個變量,mak

e只會在當前的目錄中去找尋依賴文件和目標文件。如果定義了這個變量,那么,make就會

在當當前目錄找不到的情況下,到所指定的目錄中去找尋文件了。 


VPATH = src:../headers 


上面的的定義指定兩個目錄,“src”和“../headers”,make會按照這個順序進行搜索。

目錄由“冒號”分隔。(當然,當前目錄永遠是最高優先搜索的地方) 


另一個設置文件搜索路徑的方法是使用make的“vpath”關鍵字(注意,它是全小寫的),

這不是變量,這是一個make的關鍵字,這和上面提到的那個VPATH變量很類似,但是它更為

靈活。它可以指定不同的文件在不同的搜索目錄中。這是一個很靈活的功能。它的使用方

法有三種: 


1、vpath <pattern> <directories> 


為符合模式<pattern>的文件指定搜索目錄<directories>。 


2、vpath <pattern> 


清除符合模式<pattern>的文件的搜索目錄。 


3、vpath 


清除所有已被設置好了的文件搜索目錄。 


vapth使用方法中的<pattern>需要包含“%”字符。“%”的意思是匹配零或若干字符,例

如,“%.h”表示所有以“.h”結尾的文件。<pattern>指定了要搜索的文件集,而<direc

tories>則指定了<pattern>的文件集的搜索的目錄。例如: 


vpath %.h ../headers 


該語句表示,要求make在“../headers”目錄下搜索所有以“.h”結尾的文件。(如果某

文件在當前目錄沒有找到的話) 


我們可以連續地使用vpath語句,以指定不同搜索策略。如果連續的vpath語句中出現了相

同的<pattern>,或是被重復了的<pattern>,那么,make會按照vpath語句的先后順序來執

行搜索。如: 


vpath %.c foo 

vpath % blish 

vpath %.c bar 


其表示“.c”結尾的文件,先在“foo”目錄,然后是“blish”,最后是“bar”目錄。 




vpath %.c foo:bar 

vpath % blish 


而上面的語句則表示“.c”結尾的文件,先在“foo”目錄,然后是“bar”目錄,最后才

是“blish”目錄。 



五、偽目標 


最早先的一個例子中,我們提到過一個“clean”的目標,這是一個“偽目標”, 


clean: 

rm *.o temp 


正像我們前面例子中的“clean”一樣,即然我們生成了許多文件編譯文件,我們也應該提

供一個清除它們的“目標”以備完整地重編譯而用。 (以“make clean”來使用該目標)



因為,我們并不生成“clean”這個文件。“偽目標”并不是一個文件,只是一個標簽,由

于“偽目標”不是文件,所以make無法生成它的依賴關系和決定它是否要執行。我們只有

通過顯示地指明這個“目標”才能讓其生效。當然,“偽目標”的取名不能和文件名重名

,不然其就失去了“偽目標”的意義了。 


當然,為了避免和文件重名的這種情況,我們可以使用一個特殊的標記“.PHONY”來顯示

地指明一個目標是“偽目標”,向make說明,不管是否有這個文件,這個目標就是“偽目

標”。 


.PHONY : clean 


只要有這個聲明,不管是否有“clean”文件,要運行“clean”這個目標,只有“make c

lean”這樣。于是整個過程可以這樣寫: 


.PHONY: clean 

clean: 

rm *.o temp 


偽目標一般沒有依賴的文件。但是,我們也可以為偽目標指定所依賴的文件。偽目標同樣

可以作為“默認目標”,只要將其放在第一個。一個示例就是,如果你的Makefile需要一

口氣生成若干個可執行文件,但你只想簡單地敲一個make完事,并且,所有的目標文件都

寫在一個Makefile中,那么你可以使用“偽目標”這個特性: 


all : prog1 prog2 prog3 

.PHONY : all 


prog1 : prog1.o utils.o 

cc -o prog1 prog1.o utils.o 


prog2 : prog2.o 

cc -o prog2 prog2.o 


prog3 : prog3.o sort.o utils.o 

cc -o prog3 prog3.o sort.o utils.o 


我們知道,Makefile中的第一個目標會被作為其默認目標。我們聲明了一個“all”的偽目

標,其依賴于其它三個目標。由于偽目標的特性是,總是被執行的,所以其依賴的那三個

目標就總是不如“all”這個目標新。所以,其它三個目標的規則總是會被決議。也就達到

了我們一口氣生成多個目標的目的。“.PHONY : all”聲明了“all”這個目標為“偽目標

”。 


隨便提一句,從上面的例子我們可以看出,目標也可以成為依賴。所以,偽目標同樣也可

成為依賴。看下面的例子: 


.PHONY: cleanall cleanobj cleandiff 


cleanall : cleanobj cleandiff 

rm program 


cleanobj : 

rm *.o 


cleandiff : 

rm *.diff 


“make clean”將清除所有要被清除的文件。“cleanobj”和“cleandiff”這兩個偽目標

有點像“子程序”的意思。我們可以輸入“make cleanall”和“make cleanobj”和“ma

ke cleandiff”命令來達到清除不同種類文件的目的。 
 
2006-12-8 17:12 #2 
            
  
ReTurner.D 

版主 


 

   
精華 31
積分 917
帖子 1756
水位 2750 
技術分 92 
來自 江蘇鹽城
狀態 離線  六、多目標 


Makefile的規則中的目標可以不止一個,其支持多目標,有可能我們的多個目標同時依賴

于一個文件,并且其生成的命令大體類似。于是我們就能把其合并起來。當然,多個目標

的生成規則的執行命令是同一個,這可能會可我們帶來麻煩,不過好在我們的可以使用一

個自動化變量“$@”(關于自動化變量,將在后面講述),這個變量表示著目前規則中所

有的目標的集合,這樣說可能很抽象,還是看一個例子吧。 


bigoutput littleoutput : text.g 

generate text.g -$(subst output,,$@) > $@ 


上述規則等價于: 


bigoutput : text.g 

generate text.g -big > bigoutput 

littleoutput : text.g 

generate text.g -little > littleoutput 


其中,-$(subst output,,$@)中的“$”表示執行一個Makefile的函數,函數名為sub 

st,后面的為參數。關于函數,將在后面講述。這里的這個函數是截取字符串的意思,“

$@”表示目標的集合,就像一個數組,“$@”依次取出目標,并執于命令。 



七、靜態模式 


靜態模式可以更加容易地定義多目標的規則,可以讓我們的規則變得更加的有彈性和靈活

。我們還是先來看一下語法: 


<targets ...>: <target-pattern>: <prereq-patterns ...> 

<commands> 

.... 



targets定義了一系列的目標文件,可以有通配符。是目標的一個集合。 


target-parrtern是指明了targets的模式,也就是的目標集模式。 


prereq-parrterns是目標的依賴模式,它對target-parrtern形成的模式再進行一次依 


賴目標的定義。 


這樣描述這三個東西,可能還是沒有說清楚,還是舉個例子來說明一下吧。如果我們的<t

arget-parrtern>定義成“%.o”,意思是我們的<target>集合中都是以“.o”結尾的,而

如果我們的<prereq-parrterns>定義成“%.c”,意思是對<target-parrtern>所形成的目

標集進行二次定義,其計算方法是,取<target-parrtern>模式中的“%”(也就是去掉了

[.o]這個結尾),并為其加上[.c]這個結尾,形成的新集合。 


所以,我們的“目標模式”或是“依賴模式”中都應該有“%”這個字符,如果你的文件名

中有“%”那么你可以使用反斜杠“\”進行轉義,來標明真實的“%”字符。 


看一個例子: 


objects = foo.o bar.o 


all: $(objects) 


$(objects): %.o: %.c 

$(CC) -c $(CFLAGS) $< -o $@ 



上面的例子中,指明了我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的

目標,也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取

模式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴

目標就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動化變量,“$<”表示所有

的依賴目標集(也就是“foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.o”

)。于是,上面的規則展開后等價于下面的規則: 


foo.o : foo.c 

$(CC) -c $(CFLAGS) foo.c -o foo.o 

bar.o : bar.c 

$(CC) -c $(CFLAGS) bar.c -o bar.o 


試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”就可

以寫完一堆規則,實在是太有效率了。“靜態模式規則”的用法很靈活,如果用得好,那

會一個很強大的功能。再看一個例子: 



files = foo.elc bar.o lose.o 


$(filter %.o,$(files)): %.o: %.c 

$(CC) -c $(CFLAGS) $< -o $@ 

$(filter %.elc,$(files)): %.elc: %.el 

emacs -f batch-byte-compile $< 



$(filter %.o,$(files))表示調用Makefile的filter函數,過濾“$filter”集,只要其中

模式為“%.o”的內容。其的它內容,我就不用多說了吧。這個例字展示了Makefile中更大

的彈性。 



八、自動生成依賴性 


在Makefile中,我們的依賴關系可能會需要包含一系列的頭文件,比如,如果我們的main

.c中有一句“#include "defs.h"”,那么我們的依賴關系應該是: 


main.o : main.c defs.h 


但是,如果是一個比較大型的工程,你必需清楚哪些C文件包含了哪些頭文件,并且,你在

加入或刪除頭文件時,也需要小心地修改Makefile,這是一個很沒有維護性的工作。為了

避免這種繁重而又容易出錯的事情,我們可以使用C/C++編譯的一個功能。大多數的C/C++

編譯器都支持一個“-M”的選項,即自動找尋源文件中包含的頭文件,并生成一個依賴關

系。例如,如果我們執行下面的命令: 


cc -M main.c 


其輸出是: 


main.o : main.c defs.h 


于是由編譯器自動生成的依賴關系,這樣一來,你就不必再手動書寫若干文件的依賴關系

,而由編譯器自動生成了。需要提醒一句的是,如果你使用GNU的C/C++編譯器,你得用“

-MM”參數,不然,“-M”參數會把一些標準庫的頭文件也包含進來。 


gcc -M main.c的輸出是: 


main.o: main.c defs.h /usr/include/stdio.h /usr/include/features.h \ 

/usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ 

/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \ 

/usr/include/bits/types.h /usr/include/bits/pthreadtypes.h \ 

/usr/include/bits/sched.h /usr/include/libio.h \ 

/usr/include/_G_config.h /usr/include/wchar.h \ 

/usr/include/bits/wchar.h /usr/include/gconv.h \ 

/usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \ 

/usr/include/bits/stdio_lim.h 



gcc -MM main.c的輸出則是: 


main.o: main.c defs.h 


那么,編譯器的這個功能如何與我們的Makefile聯系在一起呢。因為這樣一來,我們的Ma

kefile也要根據這些源文件重新生成,讓Makefile自已依賴于源文件?這個功能并不現實

,不過我們可以有其它手段來迂回地實現這一功能。GNU組織建議把編譯器為每一個源文件

的自動生成的依賴關系放到一個文件中,為每一個“name.c”的文件都生成一個“name.d

”的Makefile文件,[.d]文件中就存放對應[.c]文件的依賴關系。 


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩不卡一区二区| 欧美人与性动xxxx| 久久国产综合精品| 天天综合天天做天天综合| 一区二区三区加勒比av| 综合分类小说区另类春色亚洲小说欧美| 久久综合国产精品| 久久久久97国产精华液好用吗| 日韩一级片在线播放| 精品国产一区二区精华| 精品va天堂亚洲国产| 久久精品一区二区| 国产精品夫妻自拍| 亚洲男人的天堂在线观看| 亚洲人123区| 午夜精品一区在线观看| 日本免费新一区视频| 经典三级一区二区| 国产99久久久国产精品免费看| jlzzjlzz亚洲日本少妇| 日本久久精品电影| 日韩一区二区在线看| 精品久久久久久久久久久院品网| 久久久蜜桃精品| 国产精品国产三级国产aⅴ原创| 亚洲欧美日韩在线不卡| 天天色天天爱天天射综合| 国产在线日韩欧美| jlzzjlzz亚洲女人18| 欧美日韩精品欧美日韩精品| 精品剧情v国产在线观看在线| 国产免费成人在线视频| 亚洲影视资源网| 老色鬼精品视频在线观看播放| 国产在线不卡一区| 欧美性猛交xxxx乱大交退制版| 日韩欧美中文字幕精品| 亚洲区小说区图片区qvod| 秋霞午夜鲁丝一区二区老狼| 风流少妇一区二区| 欧美一区二区三区在线视频| 国产精品免费视频一区| 日韩精品色哟哟| av在线播放不卡| 精品久久久影院| 亚洲h动漫在线| 成人免费毛片高清视频| 91精品国产综合久久香蕉的特点| 中文字幕久久午夜不卡| 日韩中文欧美在线| 91蜜桃免费观看视频| www国产亚洲精品久久麻豆| 亚洲精品久久嫩草网站秘色| 国产成人超碰人人澡人人澡| 日韩西西人体444www| 亚洲国产精品一区二区久久| 成人高清免费在线播放| 精品久久久久久久久久久久包黑料| 亚洲最大色网站| av午夜一区麻豆| 国产精品视频一区二区三区不卡| 免费高清在线一区| 欧美日韩精品系列| 亚洲国产欧美一区二区三区丁香婷| 国产麻豆成人传媒免费观看| 欧美va亚洲va香蕉在线| 水野朝阳av一区二区三区| 色呦呦国产精品| 亚洲人吸女人奶水| 成人高清视频在线| 国产精品精品国产色婷婷| 国产·精品毛片| 欧美激情一区三区| 高清不卡一二三区| 中文字幕欧美区| 成人av网址在线| 国产精品福利一区二区三区| 国产成人福利片| 国产精品福利一区| 色av一区二区| 亚洲男人的天堂av| 欧美午夜宅男影院| 日韩精品电影在线观看| 欧美日本视频在线| 日韩经典一区二区| 精品日韩99亚洲| 国产精品一区一区| 国产精品的网站| 日本大香伊一区二区三区| 一级精品视频在线观看宜春院| 91黄色小视频| 午夜精品福利一区二区三区蜜桃| 欧美精品色一区二区三区| 水蜜桃久久夜色精品一区的特点| 欧美精品777| 国产一区美女在线| 成人免费视频在线观看| av在线不卡观看免费观看| 亚洲乱码国产乱码精品精小说| 欧美午夜电影一区| 精品中文字幕一区二区| 久久久国产精品不卡| 成人av在线一区二区| 亚洲一区二区三区在线看| 欧美一区二区精品| 国产ts人妖一区二区| 亚洲激情成人在线| 日韩免费电影一区| 不卡的av中国片| 天堂在线亚洲视频| 欧美激情一区二区三区四区| 91久久精品网| 国产在线观看一区二区| 亚洲日本乱码在线观看| 制服丝袜亚洲播放| 不卡av在线免费观看| 亚洲动漫第一页| 国产欧美精品在线观看| 欧美丰满少妇xxxbbb| 国产精品91一区二区| 午夜亚洲福利老司机| 国产人妖乱国产精品人妖| 337p亚洲精品色噜噜| 波多野结衣中文字幕一区二区三区| 天天综合色天天综合色h| 国产欧美精品一区二区三区四区| 欧美精品在欧美一区二区少妇| 国产91在线看| 黄页视频在线91| 日韩—二三区免费观看av| 亚洲欧美国产三级| 国产亚洲一区二区三区在线观看 | 亚洲欧美福利一区二区| 欧美一卡2卡3卡4卡| 91极品视觉盛宴| jiyouzz国产精品久久| 国产精品一级片在线观看| 日韩avvvv在线播放| 亚洲国产成人porn| 亚洲精选在线视频| 中文字幕日韩精品一区| 久久久午夜精品理论片中文字幕| 欧美一区二区三区啪啪| 欧美日本一区二区三区| 91成人国产精品| 色成年激情久久综合| 99re8在线精品视频免费播放| 国产成人午夜视频| 国产呦精品一区二区三区网站| 日本欧美一区二区三区乱码| 亚洲电影欧美电影有声小说| 伊人色综合久久天天人手人婷| 亚洲欧美一区二区视频| 国产精品网站导航| 国产精品欧美一区喷水| 国产精品久久影院| 国产精品电影一区二区三区| 国产精品理论在线观看| 中文字幕一区视频| 亚洲免费av网站| 亚洲无人区一区| 婷婷久久综合九色综合伊人色| 亚洲午夜久久久久久久久电影院 | 精品一区二区三区视频在线观看 | 91免费精品国自产拍在线不卡| kk眼镜猥琐国模调教系列一区二区 | 欧美性xxxxx极品少妇| 欧美日韩国产成人在线免费| 7777精品伊人久久久大香线蕉完整版 | 欧美色欧美亚洲另类二区| 欧美影院精品一区| 欧美日韩在线不卡| 欧美videos大乳护士334| 久久亚洲综合av| 国产精品久久久久久久久动漫| 亚洲免费观看视频| 五月天欧美精品| 国内精品伊人久久久久影院对白| 国产成人综合视频| 91精品91久久久中77777| 9191精品国产综合久久久久久| 欧美大白屁股肥臀xxxxxx| 久久综合色婷婷| 亚洲免费观看高清完整版在线 | 欧美日韩国产精品成人| 欧美高清视频不卡网| 久久久综合激的五月天| 亚洲精品国产品国语在线app| 日韩av在线发布| 成人激情黄色小说| 欧美日韩电影一区| 中文字幕第一区二区| 日韩av网站免费在线| 国产电影一区二区三区| 欧美亚洲综合网| 久久久久久免费| 丝袜诱惑亚洲看片| 成人av集中营| 日韩午夜激情av| 亚洲嫩草精品久久|