Makefile中的 的區別

2021-08-15 18:23:25 字數 2053 閱讀 2777

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...