Makefile變數 簡單的文字替換

2021-06-26 22:01:56 字數 2137 閱讀 9935

這次的試驗,只有乙個makefile,別的沒有任何檔案,通過乙個偽目標show來演示變數的使用,好奇葩啊。

[plain]view plain

copy

cc=gcc  

src=a.c b.c  

.phony:show  

show:  

@echo $(cc)  

@echo $(src)  

執行make show,將會顯示

[plain]view plain

copy

gcc  

a.c b.c  

so easy。。。

echo前面為什麼要加上@呢?

[plain]view plain

copy

.phony:reason  

reason:  

@echo "with @"  

echo "without @"  

我們執行make reason,將會輸出:

[plain]view plain

copy

with @  

echo "without @"  

without @  

原來如此,不加@的話,會把本條命令完整的顯示出來,然後再顯示輸出的內容。加上@之後,就只會顯示真正要被輸出的內容。

還有,makefile中的變數類似於c語言中的巨集,只是簡單的文字替換。

[plain]view plain

copy

city=henan  

school=zzti  

info=$(city)-$(school)  

.phony:show  

show:  

@echo $(info)  

執行makeshow的話,將會輸出:

[plain]view plain

copy

henan-zzti  

但是,有一種情況給人這種感覺「難道真的是簡單的文字替換???」

我們在目錄內新增兩個檔案a.c和b.c,不用寫任何內容。

[plain]view plain

copy

src=*.c  

.phony:show  

show:  

@echo $(src)  

執行make show,反正我第一感覺是輸出*.c,但是實際輸出令我****。

[plain]view plain

copy

a.c b.c  

這個問題令小弟想了好久,搞不明白。知道膝蓋中了一劍。

其實,makefile中的變數還真的是文字替換,因為@echo $(src)*****@echo *.c

但是,恰好是echo犯病了,把*當做萬用字元,把本目錄內所有以.c結尾的檔案都輸出了。

可以試一下,直接在終端執行echo *.c,輸出的就是a.c和b.c。

下面的例子也是證據:

[plain]view plain

copy

src=*.c  

realsrc=a.c b.c  

.phony:show  

show:  

echo $(src)  

@echo "-------------"  

echo $(realsrc)  

注意只有中間的乙個echo加了@,輸出結果為:

[plain]view plain

copy

echo *.c  

a.c b.c  

-------------  

echo a.c b.c  

a.c b.c  

echo  $(src)===echo *.c

所以先輸出echo *.c,然後輸出a.c b.c

echo $(realsrc)===echo a.c b.c

試驗證明:makefile中的巨集還真的是簡單的文字替換。

Makefile的內部變數

curdir是makefile的內嵌變數,顯示當前路徑 表示目標檔案的名稱,包含副檔名 表示所有的依賴檔案,以空格隔開,不重複 表示第乙個依賴檔案的名稱 表示所有的依賴檔案,空格隔開,可以重複 表示目標檔案的名稱,不包含副檔名 依賴項中,所有比目標檔案新的依賴檔案 cc c語言編譯器的名稱 cpp ...

makefile變數的定義

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

Makefile中的變數

makefile中的變數 2010年03月25日 b makefile b b 中的變數 b b b b b b 在makefile中,變數就是乙個名字 像是c語言中的巨集 代表乙個文字字串 變數的值 在makefile的目標 依賴 命令中引用乙個變數的地方,變數會被它的值所取代 與c語言中巨集引用...