Makefile中override 指示符

2021-06-27 02:52:31 字數 2230 閱讀 5747

通常在執行make時,如果通過命令列定義了乙個變數,那麼它將替代在makefile中出現的同名變數的定義。就是說,對於乙個在makefile中使用常規方式(使用「=」、「:=」或者「define」)定義的變數,我們可以在執行make時通過命令列方式重新指定這個變數的值,命令列指定的值將替代出現在makefile中此變數的值。如果不希望命令列指定的變數值替代在makefile中的變數定義,那麼我們需要在makefile中使用指示符「override」來對這個變數進行宣告,像下邊那樣:

override variable = value

或者:

override variable := value

也可以對變數使用追加方式:

override variable += more text

對於追加方式需要說明的是:變數在定義時使用了「override」,則後續對它值進行追加時,也需要使用帶有「override」指示符的追加方式。否則對此變數值的追加不會生效。

指示符「override」並不是用來調整makefile和執行時命令引數的衝突,其存在的目的是為了使使用者可以改變或者追加那些使用make的命令列指定的變數的定義。從另外乙個角度來說,就是實現了在makefile中增加或者修改命令列引數的一種機制。我們可能會有這樣的需求;可以通過命令列來指定一些附加的編譯引數,對一些通用的引數或者必需的編譯引數在makefile中指定,而在命令列中指定一些特殊的引數。對於這種需求,我們就需要使用指示符「override」來實現。

例如:無論命令列指定那些編譯引數,編譯時必須開啟「-g」選項,那麼在makefile中編譯選項「cflags」應該這樣定義:

override cflags += -g

這樣,在執行make時無論在命令列中指定了那些編譯選項(「指定cflags」的值),編譯時「-g」引數始終存在。

同樣,使用「define」定義變數時同樣也可以使用「override」進行宣告。例如:

override define foo

bar

endef

最後我們來看乙個例子:

# sample makefile

exef = foo

override cflags += -wall –g

.phony : all debug test

all : $(exef)

foo : foo.c

………..

………..

$(exef) : debug.h

$(cc) $(cflags) $(addsuffix .c,$@) –o $@

debug :

@echo 」cflags = $(cflags)」

執行:make cflags=-o2 將顯式編譯「foo」的過程是「cc –o2 –wall –g foo.c –o foo」。執行「make cflags=-o2 debug」可以檢視到變數「cflags」的值為「–o2 –wall –g」。另外,這個例子中,如果把變數「cflags」之前的指示符「override」去掉,使用相同的命令將得到不同的結果。大家試試看!

java中overload和override區別

1 綜述 overload它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,呼叫時vm就會根據不同的引數樣式,來選擇合適的方法執行,是乙個類中多型性的一種表現。override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,...

Java中overload與override的區別

1 綜述 重寫 override 也稱覆蓋,它是父類與子類之間多型性的一種表現,而過載 overload 是乙個類中多型性的一種表現。override從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。overload它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區...

java中overload與override的區別

1 綜述 重寫 override 也稱覆蓋,它是父類與子類之間多型性的一種表現,而過載 overload 是乙個類中多型性的一種表現。override從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。overload它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區...