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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? makefile編寫.txt

?? 關(guān)于ns使用技巧的大集
?? TXT
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
$(objects) : defs.h 


變量會(huì)在使用它的地方精確地展開,就像C/C++中的宏一樣,例如: 


foo = c 

prog.o : prog.$(foo) 

$(foo)$(foo) -$(foo) prog.$(foo) 


展開后得到: 


prog.o : prog.c 

cc -c prog.c 


當(dāng)然,千萬(wàn)不要在你的Makefile中這樣干,這里只是舉個(gè)例子來(lái)表明Makefile中的變量在

使用處展開的真實(shí)樣子。可見其就是一個(gè)“替代”的原理。 


另外,給變量加上括號(hào)完全是為了更加安全地使用這個(gè)變量,在上面的例子中,如果你不

想給變量加上括號(hào),那也可以,但我還是強(qiáng)烈建議你給變量加上括號(hào)。 



二、變量中的變量 


在定義變量的值時(shí),我們可以使用其它變量來(lái)構(gòu)造變量的值,在Makefile中有兩種方式來(lái)

在用變量定義變量的值。 


先看第一種方式,也就是簡(jiǎn)單的使用“=”號(hào),在“=”左側(cè)是變量,右側(cè)是變量的值,右

側(cè)變量的值可以定義在文件的任何一處,也就是說(shuō),右側(cè)中的變量不一定非要是已定義好

的值,其也可以使用后面定義的值。如: 


foo = $(bar) 

bar = $(ugh) 

ugh = Huh? 


all: 

echo $(foo) 


我們執(zhí)行“make all”將會(huì)打出變量$(foo)的值是“Huh?”( $(foo)的值是$(bar),$(b

ar)的值是$(ugh),$(ugh)的值是“Huh?”)可見,變量是可以使用后面的變量來(lái)定義的。



這個(gè)功能有好的地方,也有不好的地方,好的地方是,我們可以把變量的真實(shí)值推到后面

來(lái)定義,如: 


CFLAGS = $(include_dirs) -O 

include_dirs = -Ifoo -Ibar 


當(dāng)“CFLAGS”在命令中被展開時(shí),會(huì)是“-Ifoo -Ibar -O”。但這種形式也有不好的地方

,那就是遞歸定義,如: 


CFLAGS = $(CFLAGS) -O 


或: 


A = $(B) 

B = $(A) 


這會(huì)讓make陷入無(wú)限的變量展開過程中去,當(dāng)然,我們的make是有能力檢測(cè)這樣的定義,

并會(huì)報(bào)錯(cuò)。還有就是如果在變量中使用函數(shù),那么,這種方式會(huì)讓我們的make運(yùn)行時(shí)非常

慢,更糟糕的是,他會(huì)使用得兩個(gè)make的函數(shù)“wildcard”和“shell”發(fā)生不可預(yù)知的錯(cuò)

誤。因?yàn)槟悴粫?huì)知道這兩個(gè)函數(shù)會(huì)被調(diào)用多少次。 


為了避免上面的這種方法,我們可以使用make中的另一種用變量來(lái)定義變量的方法。這種

方法使用的是“:=”操作符,如: 


x := foo 

y := $(x) bar 

x := later 


其等價(jià)于: 


y := foo bar 

x := later 


值得一提的是,這種方法,前面的變量不能使用后面的變量,只能使用前面已定義好了的

變量。如果是這樣: 


y := $(x) bar 

x := foo 


那么,y的值是“bar”,而不是“foo bar”。 


上面都是一些比較簡(jiǎn)單的變量使用了,讓我們來(lái)看一個(gè)復(fù)雜的例子,其中包括了make的函

數(shù)、條件表達(dá)式和一個(gè)系統(tǒng)變量“MAKELEVEL”的使用: 


ifeq (0,${MAKELEVEL}) 

cur-dir := $(shell pwd) 

whoami := $(shell whoami) 

host-type := $(shell arch) 

MAKE := ${MAKE} host-type=${host-type} whoami=${whoami} 

endif 


關(guān)于條件表達(dá)式和函數(shù),我們?cè)诤竺嬖僬f(shuō),對(duì)于系統(tǒng)變量“MAKELEVEL”,其意思是,如果

我們的make有一個(gè)嵌套執(zhí)行的動(dòng)作(參見前面的“嵌套使用make”),那么,這個(gè)變量會(huì)

記錄了我們的當(dāng)前Makefile的調(diào)用層數(shù)。 


下面再介紹兩個(gè)定義變量時(shí)我們需要知道的,請(qǐng)先看一個(gè)例子,如果我們要定義一個(gè)變量

,其值是一個(gè)空格,那么我們可以這樣來(lái): 


nullstring := 

space := $(nullstring) # end of the line 


nullstring是一個(gè)Empty變量,其中什么也沒有,而我們的space的值是一個(gè)空格。因?yàn)樵?
操作符的右邊是很難描述一個(gè)空格的,這里采用的技術(shù)很管用,先用一個(gè)Empty變量來(lái)標(biāo)明

變量的值開始了,而后面采用“#”注釋符來(lái)表示變量定義的終止,這樣,我們可以定義出

其值是一個(gè)空格的變量。請(qǐng)注意這里關(guān)于“#”的使用,注釋符“#”的這種特性值得我們

注意,如果我們這樣定義一個(gè)變量: 


dir := /foo/bar # directory to put the frobs in 


dir這個(gè)變量的值是“/foo/bar”,后面還跟了4個(gè)空格,如果我們這樣使用這樣變量來(lái)指

定別的目錄——“$(dir)/file”那么就完蛋了。 


還有一個(gè)比較有用的操作符是“?=”,先看示例: 


FOO ?= bar 


其含義是,如果FOO沒有被定義過,那么變量FOO的值就是“bar”,如果FOO先前被定義過

,那么這條語(yǔ)將什么也不做,其等價(jià)于: 


ifeq ($(origin FOO), undefined) 

FOO = bar 

endif 
 
2006-12-8 17:13 #3 
            
  
ReTurner.D 

版主 


 

   
精華 31
積分 917
帖子 1756
水位 2750 
技術(shù)分 92 
來(lái)自 江蘇鹽城
狀態(tài) 離線  三、變量高級(jí)用法 


這里介紹兩種變量的高級(jí)使用方法,第一種是變量值的替換。 


我們可以替換變量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意

思是,把變量“var”中所有以“a”字串“結(jié)尾”的“a”替換成“b”字串。這里的“結(jié)

尾”意思是“空格”或是“結(jié)束符”。 


還是看一個(gè)示例吧: 


foo := a.o b.o c.o 

bar := $(foo:.o=.c) 


這個(gè)示例中,我們先定義了一個(gè)“$(foo)”變量,而第二行的意思是把“$(foo)”中所有

以“.o”字串“結(jié)尾”全部替換成“.c”,所以我們的“$(bar)”的值就是“a.c b.c c.

c”。 


另外一種變量替換的技術(shù)是以“靜態(tài)模式”(參見前面章節(jié))定義的,如: 


foo := a.o b.o c.o 

bar := $(foo:%.o=%.c) 


這依賴于被替換字串中的有相同的模式,模式中必須包含一個(gè)“%”字符,這個(gè)例子同樣讓

$(bar)變量的值為“a.c b.c c.c”。 


第二種高級(jí)用法是——“把變量的值再當(dāng)成變量”。先看一個(gè)例子: 


x = y 

y = z 

a := $($(x)) 


在這個(gè)例子中,$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。(注

意,是“x=y”,而不是“x=$(y)”) 


我們還可以使用更多的層次: 


x = y 

y = z 

z = u 

a := $($($(x))) 


這里的$(a)的值是“u”,相關(guān)的推導(dǎo)留給讀者自己去做吧。 


讓我們?cè)購(gòu)?fù)雜一點(diǎn),使用上“在變量定義中使用變量”的第一個(gè)方式,來(lái)看一個(gè)例子: 




x = $(y) 

y = z 

z = Hello 

a := $($(x)) 


這里的$($(x))被替換成了$($(y)),因?yàn)?(y)值是“z”,所以,最終結(jié)果是:a:=$(z),

也就是“Hello”。 


再?gòu)?fù)雜一點(diǎn),我們?cè)偌由虾瘮?shù): 


x = variable1 

variable2 := Hello 

y = $(subst 1,2,$(x)) 

z = y 

a := $($($(z))) 


這個(gè)例子中,“$($($(z)))”擴(kuò)展為“$($(y))”,而其再次被擴(kuò)展為“$($(subst 1,2,$

(x)))”。$(x)的值是“variable1”,subst函數(shù)把“variable1”中的所有“1”字串替換

成“2”字串,于是,“variable1”變成“variable2”,再取其值,所以,最終,$(a)的

值就是$(variable2)的值——“Hello”。(喔,好不容易) 


在這種方式中,或要可以使用多個(gè)變量來(lái)組成一個(gè)變量的名字,然后再取其值: 


first_second = Hello 

a = first 

b = second 

all = $($a_$b) 


這里的“$a_$b”組成了“first_second”,于是,$(all)的值就是“Hello”。 


再來(lái)看看結(jié)合第一種技術(shù)的例子: 


a_objects := a.o b.o c.o 

1_objects := 1.o 2.o 3.o 


sources := $($(a1)_objects:.o=.c) 


這個(gè)例子中,如果$(a1)的值是“a”的話,那么,$(sources)的值就是“a.c b.c c.c”;

如果$(a1)的值是“1”,那么$(sources)的值是“1.c 2.c 3.c”。 


再來(lái)看一個(gè)這種技術(shù)和“函數(shù)”與“條件語(yǔ)句”一同使用的例子: 


ifdef do_sort 

func := sort 

else 

func := strip 

endif 


bar := a d b g q c 


foo := $($(func) $(bar)) 


這個(gè)示例中,如果定義了“do_sort”,那么:foo := $(sort a d b g q c),于是$(foo

)的值就是“a b c d g q”,而如果沒有定義“do_sort”,那么:foo := $(sort a d b

g q c),調(diào)用的就是strip函數(shù)。 


當(dāng)然,“把變量的值再當(dāng)成變量”這種技術(shù),同樣可以用在操作符的左邊: 


dir = foo 

$(dir)_sources := $(wildcard $(dir)/*.c) 

define $(dir)_print 

lpr $($(dir)_sources) 

endef 


這個(gè)例子中定義了三個(gè)變量:“dir”,“foo_sources”和“foo_print”。 



四、追加變量值 


我們可以使用“+=”操作符給變量追加值,如: 


objects = main.o foo.o bar.o utils.o 

objects += another.o 


于是,我們的$(objects)值變成:“main.o foo.o bar.o utils.o another.o”(anothe

r.o被追加進(jìn)去了) 


使用“+=”操作符,可以模擬為下面的這種例子: 


objects = main.o foo.o bar.o utils.o 

objects := $(objects) another.o 


所不同的是,用“+=”更為簡(jiǎn)潔。 


如果變量之前沒有定義過,那么,“+=”會(huì)自動(dòng)變成“=”,如果前面有變量定義,那么“

+=”會(huì)繼承于前次操作的賦值符。如果前一次的是“:=”,那么“+=”會(huì)以“:=”作為其

賦值符,如: 


variable := value 

variable += more 


等價(jià)于: 


variable := value 

variable := $(variable) more 


但如果是這種情況: 


variable = value 

variable += more 


由于前次的賦值符是“=”,所以“+=”也會(huì)以“=”來(lái)做為賦值,那么豈不會(huì)發(fā)生變量的

遞補(bǔ)歸定義,這是很不好的,所以make會(huì)自動(dòng)為我們解決這個(gè)問題,我們不必?fù)?dān)心這個(gè)問

題。 



五、override 指示符 


如果有變量是通常make的命令行參數(shù)設(shè)置的,那么Makefile中對(duì)這個(gè)變量的賦值會(huì)被忽略

。如果你想在Makefile中設(shè)置這

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美中文字幕一区| 欧美一区永久视频免费观看| 国产尤物一区二区在线| 日韩中文欧美在线| 亚洲制服丝袜av| 亚洲一区二区三区三| 亚洲电影一级片| 日本中文字幕不卡| 久久se这里有精品| 国产一区中文字幕| 国产成人免费视频网站高清观看视频 | 国产精品538一区二区在线| 久久精品国产久精国产| 国产在线看一区| 国产成人免费av在线| 99综合电影在线视频| 色综合久久中文综合久久牛| 91国产视频在线观看| 欧美午夜理伦三级在线观看| 欧美区视频在线观看| 日韩精品专区在线影院重磅| 久久综合九色综合97_久久久| 久久精品夜色噜噜亚洲aⅴ| 国产精品美女久久久久aⅴ国产馆| 国产精品久久久久久妇女6080| 亚洲欧洲99久久| 亚洲电影一区二区| 久久99国产精品尤物| 成人午夜视频网站| 欧美丝袜自拍制服另类| 欧美一区二区不卡视频| 久久久国产精品午夜一区ai换脸| 欧美国产日韩a欧美在线观看| 亚洲人午夜精品天堂一二香蕉| 亚洲一区在线视频| 麻豆91免费看| 99精品国产一区二区三区不卡| 欧美午夜电影在线播放| 日韩精品一区二区在线观看| 国产精品色眯眯| 日韩国产高清在线| 成人的网站免费观看| 777xxx欧美| 国产精品乱子久久久久| 偷拍亚洲欧洲综合| 成人v精品蜜桃久久一区| 精品视频在线免费| 国产清纯在线一区二区www| 亚洲高清免费视频| 国产丶欧美丶日本不卡视频| 欧美系列日韩一区| 日本一区二区成人| 日本亚洲免费观看| 色94色欧美sute亚洲13| 26uuu国产在线精品一区二区| 亚洲欧美日韩一区二区 | 成人丝袜视频网| 欧美日韩第一区日日骚| 中文字幕免费一区| 日韩精品电影在线| 一本一道久久a久久精品| www国产亚洲精品久久麻豆| 亚洲激情校园春色| 国产成人综合网站| 日韩精品中文字幕一区二区三区| 亚洲三级在线免费| 国产成人精品影视| 日韩午夜在线影院| 亚洲成人黄色影院| 99re成人精品视频| 国产女人18水真多18精品一级做| 日韩中文字幕麻豆| 在线观看欧美精品| **网站欧美大片在线观看| 国产原创一区二区| 欧美一区二区久久| 亚洲第一久久影院| 日本国产一区二区| 亚洲欧洲精品一区二区三区 | 亚洲成人一二三| 91影院在线免费观看| 国产视频一区二区三区在线观看| 免费看日韩a级影片| 欧美日韩国产色站一区二区三区| 亚洲色图丝袜美腿| 成人黄色av电影| 国产欧美一区二区精品性色| 麻豆精品久久久| 日韩一区二区不卡| 日韩在线观看一区二区| 欧美午夜电影网| 一区二区三区欧美日| 91首页免费视频| 国产精品久久久久aaaa| 国产iv一区二区三区| 久久蜜桃av一区二区天堂| 精品在线免费视频| 精品国产区一区| 国产在线日韩欧美| 国产亚洲精品bt天堂精选| 国产精品夜夜爽| 国产女人水真多18毛片18精品视频 | 久久众筹精品私拍模特| 久久99精品久久久久久| 日韩欧美国产一区二区三区| 蜜臀久久久99精品久久久久久| 91麻豆精品国产综合久久久久久 | 欧洲激情一区二区| 亚洲综合一区二区三区| 欧美综合一区二区| 亚洲国产日韩在线一区模特| 欧美在线色视频| 五月天激情综合| 欧美一区二区三区四区久久| 日韩va欧美va亚洲va久久| 欧美一级二级三级乱码| 精品一区二区在线观看| 久久综合九色综合97婷婷| 大尺度一区二区| 亚洲精品视频免费观看| 欧美日韩免费在线视频| 美日韩黄色大片| 国产亚洲欧美在线| 色综合久久99| 水蜜桃久久夜色精品一区的特点| 日韩欧美国产精品| 国产不卡免费视频| 亚洲男帅同性gay1069| 欧美日韩国产综合一区二区| 男人的天堂久久精品| 久久精品亚洲麻豆av一区二区| av不卡免费电影| 亚洲午夜影视影院在线观看| 日韩一级精品视频在线观看| 高清国产一区二区三区| 一区二区三区四区高清精品免费观看| 欧美人牲a欧美精品| 国模套图日韩精品一区二区| 亚洲视频在线一区二区| 欧美丰满少妇xxxxx高潮对白| 韩国精品久久久| 亚洲欧美经典视频| 日韩一区二区三| 91在线精品一区二区三区| 免费观看一级特黄欧美大片| 国产精品亲子伦对白| 欧美日韩一级片在线观看| 国产在线乱码一区二区三区| 一区二区三区四区五区视频在线观看| 欧美一卡二卡在线| 99精品国产一区二区三区不卡| 日本不卡一区二区三区高清视频| 国产精品丝袜91| 欧美美女直播网站| 国产成人亚洲精品青草天美| 亚洲一区二区三区精品在线| 久久久久国产成人精品亚洲午夜| 欧美日韩在线免费视频| 国产成人免费在线视频| 日韩精品视频网站| 中文字幕综合网| 久久影院午夜论| 欧美另类z0zxhd电影| 成人国产精品视频| 狠狠网亚洲精品| 亚洲不卡av一区二区三区| 国产欧美日韩激情| 日韩欧美国产综合在线一区二区三区| 91免费国产在线| 国内外成人在线视频| 日韩综合一区二区| 亚洲精品免费在线| 中文字幕高清一区| 精品久久久久久久久久久久包黑料| 色综合久久久久综合| 国产精品2024| 蜜臀av一区二区在线免费观看| 亚洲精品免费一二三区| 亚洲国产精品传媒在线观看| 欧美大胆人体bbbb| 欧美日韩激情在线| 色综合天天综合网天天看片| 国产·精品毛片| 国产美女久久久久| 狠狠色丁香久久婷婷综合_中| 亚洲第一av色| 亚洲网友自拍偷拍| 一区二区三区不卡视频 | 不卡高清视频专区| 国产麻豆视频精品| 久久国产精品99精品国产 | 在线观看日韩精品| 色综合咪咪久久| 92精品国产成人观看免费 | 日韩精品中文字幕在线一区| 欧美伦理影视网| 欧美精品久久久久久久多人混战| 色婷婷亚洲精品| 在线视频国内一区二区| 欧美在线观看视频一区二区|