makefile編寫的時候會需要定義一些變數,這時候就需要用到「=」也就是c語言中的賦值符號來進行賦值,但有時候也會遇到":="和"?=",那麼它們的區別是什麼呢?
舉個例子:
編寫乙個makefile
[cpp]view plain
copy
a =
"equal"
all:
@echo $(a)
執行make命令,輸出equal。這是普通的變數賦值,用了「=」。有點類似於巨集的定義,但與巨集定義又有一些區別,修改**
[cpp]view plain
copy
a = $b
"equal"
b = "nocolon"
all:
@echo $(a)
執行make,輸出nocolon equal,所以在使用「=」進行變數賦值的時候,如果右邊有變數,變數在本句之後定義的,依舊不會報錯,會用之後定義的變數來替換。也就是用「=」定義變數的時候,右邊如果有變數,則這個變數的定義可以是整個makefile檔案中的任意位置。
修改上述**
[cpp]view plain
copy
b =
"colon"
a := $b "equal"
all:
@echo $(a)
執行make,輸出colon equal,這樣看上去是和"="沒有區別,但如果調換一下a、b兩變數定義的位置呢?
[cpp]view plain
copy
a := $b
"equal"
b = "colon"
all:
@echo $(a)
執行make,輸出equal,沒有colon,這樣就能看出來區別了,使用「:="進行變數的賦值時,如果右邊有變數,那麼只會使用在這條語句之前定義的變數,如果變數此時未定義,就預設這個變數為空。
所以使用"="和":="的時候,如果右邊有變數,則兩者有區別,沒有變數,兩者是沒有區別的。那麼"?="呢?
[plain]view plain
copy
b = "question"
a ?= $b "equal"
all:
@echo $(a)
執行make,輸出question equal,修改**
[plain]view plain
copy
a ?= $b "equal"
b = "question"
all:
@echo $(a)
執行make,依舊輸出question equal,說明在正常賦值這方面來說,"?="是和"="一樣使用的。那它們的不同之處在**呢?修改**
[plain]view plain
copy
a ="equal"
a ?= "question equal"
all:
@echo $(a)
執行make,輸出結果為equal。說明了使用"?="進行賦值的時候如果該變數已經賦值過了,那麼將跳過這一句,使用"="的時候,如果變數已經賦值過了,它會在進行一次賦值。
makefile編寫的時候還有乙個+=符號,+=符號又有什麼用處呢?
[plain]view plain
copy
a = "plus"
a += "equal"
all:
@echo $(a)
執行make,輸出結果為plus equal,所以+=的意思和程式語言中的+=用法差不多,是在本變數的後面加上乙個字串。
所以":="和"?="也都是賦值,但都是對"="進行了一定的限制,":="是在右邊有變數的時候只是用本句之前定義的變數,"?="是先判斷該變數是否定義過,定義過就不覆蓋定義了。
Makefile 中 的區別
在makefile中我們經常看到 這幾個賦值運算子,那麼他們有什麼區別呢?我們來做個簡單的實驗 新建乙個makefile,內容為 ifdef define vre vre hello world else endif ifeq opt define vre hello world first end...
Makefile 中 的區別
在makefile中我們經常看到 這幾個賦值運算子,那麼他們有什麼區別呢?我們來做個簡單的實驗 新建乙個makefile,內容為 ifdef define vre vre hello world else endif ifeq opt define vre hello world first end...
Makefile 中 的區別
在makefile中我們經常看到 這幾個賦值運算子,那麼他們有什麼區別呢?我們來做個簡單的實驗 新建乙個makefile,內容為 ifdef define vre vre hello world else endif ifeq opt define vre hello world first end...