在 makefile 中是支持程序設(shè)計(jì)語言中變量的概念的,makefile 中的變量只代表文本數(shù)據(jù)(字符串)。那么在 makefile 中的變量名的規(guī)則又有哪些呢?a> 變量名可以包含字符、數(shù)字以及下劃線;b> 不能包含 ":" , "#" , "=" 或 " ";c> 變量名大小寫敏感。下來我們來看看變量的定義和使用,如下
超過十載行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,小程序設(shè)計(jì),微信開發(fā),成都app軟件開發(fā)公司,同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!下來我們以代碼為例來進(jìn)行分析說明
CC := gcc TARGET := hello.out $(TARGET) : func.o main.o $(CC) -o $(TARGET) func.o main.o func.o : func.c $(CC) -o func.o -c func.c main.o : main.c $(CC) -o main.o -c main.c .PHONY : rebuild clean all rebuild : clean all all : $(TARGET) clean : rm *.o $(TARGET)我們來看看編譯結(jié)果是否和之前一樣
效果和之前是一樣的,那么我們?yōu)楹芜@樣定義變量呢?在一些大型的工程項(xiàng)目中,我們可能要編譯好幾個(gè)版本,因此定義不同的 TARGET 便會(huì)編譯出不同的版本。而且這種方法還有個(gè)好處就是編譯器可以由我們自定義選擇,比如我們將上面的 gcc 編譯器換成 g++,則只需將 CC := gcc 換成 CC := g++,下來我們來看看編譯效果
我們看到編譯器已經(jīng)換為 g++ 了。下來我們來講講 makefile 中變量的賦值方式,分為四種:a> 簡(jiǎn)單賦值(:=);b> 遞歸賦值(=);c> 條件賦值(?=);d> 追加賦值(+=)。那么不同的賦值方式其意義是不同的!下來我們來對(duì)這四種賦值方式進(jìn)行一一的解釋說明
a> 簡(jiǎn)單賦值(:=):程序設(shè)計(jì)語言中的通用的賦值方式,只針對(duì)當(dāng)前語句的變量是有效的。其用法如下
b> 遞歸賦值(=):賦值操作可能影響多個(gè)其他變量,所有與目標(biāo)變量相關(guān)的其他變量都將受到影響。其用法如下
c> 條件賦值(?=):如果變量未定義,使用賦值符號(hào)中的值定義變量;如果變量已經(jīng)定義,則賦值無效。其用法如下
d> 追加賦值(+=):原變量值之后加上一個(gè)新值,原變量值與新值之間由空格隔開。其用法如下
下來我們還是以代碼為例來進(jìn)行說明
# ex1 (:=) x := foo y := $(x)b x := new .PHONY : test test : @echo "# ex1 (:=)" @echo "x => $(x)" @echo "y => $(y)"經(jīng)過簡(jiǎn)單賦值后,x 就為 new 了,而 y 則應(yīng)該為 foob。我們來看看編譯效果
我們看到結(jié)果和我們所分析的是一樣的。下來我們來看看遞歸賦值
# ex2 (=) x = foo y = $(x)b x = new .PHONY : test test : @echo "# ex2 (=)" @echo "x => $(x)" @echo "y => $(y)"我們分析下,因?yàn)檫f歸賦值是與目標(biāo)相關(guān)的其他變量都會(huì)受到影響,那么 x 最后應(yīng)該為 new,y 就應(yīng)該為 newb。我們來看看編譯結(jié)果
為了更加形象對(duì)遞歸賦值進(jìn)行說明,我們編寫代碼如下
a = $(b) b = $(c) c = hello-makefile .PHONY : test test : @echo "# ex2 (=)" @echo "x => $(x)" @echo "y => $(y)" @echo "a => $(a)" @echo "b => $(b)" @echo "c => $(c)"我們定義 a 依賴于 b,而 b 依賴于 c。此時(shí) c 為 hello-makefile,那么依賴于它的 b 也就變?yōu)?hello-makefile 了,此時(shí)依賴于 b 的 a 也就變?yōu)?hello-makefile 了。x 和 y 此時(shí)沒定義,看看編譯會(huì)報(bào)錯(cuò)嗎?
編譯是通過的,證明在 makefile 中是支持這樣的寫法的,x 和 y 沒定義,自然也就為空了。那么 a,b,c 和我們所分析的是一樣的。所以在 makefile 中我們一般是很少直接用遞歸賦值的,因?yàn)橛锌赡軙?huì)意想不到地改變依賴于它的目標(biāo)。下來我們來看看條件賦值
# ex3 (?=) x := foo y := $(x)b x ?= new .PHONY : test test : @echo "# ex3 (?=)" @echo "x => $(x)" @echo "y => $(y)"我們?cè)谧詈髮?duì) x ?= new,意思是如果前面沒定義的話,此時(shí)它便為 new。所以 x 最后應(yīng)該為 foo,y 就應(yīng)該為 foob。我們來看看編譯結(jié)果
結(jié)果確實(shí)是這樣的,一般我們會(huì)在新定義變量時(shí)采用這樣的寫法,以防止改變之前定義時(shí)的語義。最后看看追加賦值
# ex4 (+=) x := foo y := $(x)b x += new .PHONY : test test : @echo "# ex4 (+=)" @echo "x => $(x)" @echo "y => $(y)"根據(jù)追加賦值的定義,它是直接在后面加上,但是有一個(gè)空格。所以 x 最后應(yīng)該為 foo new,y 就應(yīng)該為 foob。我們來看看編譯結(jié)果
我們看懂啊效果確實(shí)是這樣的,通過對(duì)四種賦值方式的學(xué)習(xí),我們發(fā)現(xiàn)簡(jiǎn)單賦值是跟 C 語言中是一樣的。追加賦值和 C++ 語言中的語義也是一樣的,一般在大型項(xiàng)目中是不會(huì)采用遞歸賦值這種寫法的。
歡迎大家一起來學(xué)習(xí) makefile,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。