Makefile定義變數 和 的區別

2021-06-26 22:01:56 字數 1806 閱讀 6842

makefile中變數的定義有兩種方式。

第一種: =

例如name=chen

info=$(name)

第二種: :=

例如name=chen

info:=$(name)

這兩種定義變數的區別主要是對引用的其它變數的展開時機不同。

第一種方式:使用=

name=chen

info=$(name)

在這種方式中,info的值就是「$(name)」這個字串,它的展開一直延續到命令中對info的引用,也就是在命令中出現$(info)的時候,才會用$(name)替換$(info)【因為$(info)的值是 $(name)】,然後$(name)又是對乙個變數的引用,所以用chen這個文字替換$(name),最終也就是得到$(info)的值是文字chen。

只有在命令中引用乙個變數var時,才會對var引用的其它變數進行展開,如果上面兩行後面,再加上一行

infoadd=$(info) henan

那麼,infoadd的值就是文字「$(info) henan」,直到$(infoadd)出現在命令中,才會對infoadd引用的其它變數進行層層展開。

第二種方式:使用:=

name=chen

info:=$(name)

這種方式,info在定義時,就對它所引用的變數進行展開,info的值就是文字「chen」,在命令中出現$(info),或者以同樣的方式引用$(info)定義另乙個變數時,都會用「chen」這個文字去替換$(info).

例如,再加一行

infoadd:=$(info) henan

那麼,infoadd的值就是「chen henan」這個文字。

下面是兩個印證的例子:

例1:[plain]view plain

copy

x1=a1  

y1=$(x1)  

x1=b1  

x2=a2  

y2:=$(x2)  

x2=b2  

.phony:show  

show:  

echo $(y1)  

echo $(y2)  

[plain]view plain

copy

root@ubuntu:/home/workspace/makefile/mf9# make show  

echo b1  

b1  

echo a2  

a2  

例2:[plain]view plain

copy

y1=$(x1)  

x1=a1  

y2:=$(x2)  

x2=a2  

.phony:show  

show:  

echo $(y1)  

echo $(y2)  

[plain]view plain

copy

root@ubuntu:/home/workspace/makefile/mf9# make show  

echo a1  

a1  

echo   

root@ubuntu:/home/workspace/makefile/mf9# vim makefile   

因為使用 := 定義變數時會立即展開,所以定義y2時,去展開$(x2),但是此時x2還沒有定義,所以y2的值為空。

而使用 = 定義變數,到了執行的時候,才會去展開,所以y1可以引用後面定義的x1.

makefile變數的定義

一 變數名 makefile變數名是不包括 前置空白和尾空白的任何字串。1 變數名最好由字母 數字和下劃線組成 儘管在gnu make中沒有對變數的命名有其它的限制,但是字母 數字和下劃線以外的字元 可能會在make的後續版本中被賦予特殊的含義。2 變數名大小寫敏感 3 變數名中可以包含函式或者其它...

MakeFile預定義變數

makefile中常見預定義變數 命 令 格 式 含 義 ar庫檔案維護程式的名稱,預設值為ar as匯程式設計序的名稱,預設值為as ccc編譯器的名稱,預設值為cc cppc預編譯器的名稱,預設值為 cc e cxxc 編譯器的名稱,預設值為g fcfortran編譯器的名稱,預設值為f77 r...

Makefile預定義變數

含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變數表示目標的...