您好,登錄后才能下訂單哦!
在 makefile 中存在一些預定義的變量,如自動變量:$@,$^,$< 等;還有一些特殊變量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等。下來我們先來解釋下自動變量的意義:a> $@ 是指當前規則中觸發命令被執行的目標;b> $^ 是指當前規則中的所有依賴;c> $< 是指當前規則中的第一個依賴。關于自動變量的使用如下
下來我們以代碼為例來進行分析說明
.PHONY : all first second third all : first second third @echo "\$$@ => $@" @echo "$$^ => $^" @echo "$$< => $<" first: second: third:
看看編譯結果
我們看到和我們之前解釋的是一樣的。$@便是打印我們的目標名,$^ 打印的便是依賴條件,$< 打印的是依賴當中的第一個。那么我們就可以將之前寫的 makefile 進行改寫了
CC := g++ TARGET := hello.out $(TARGET) : func.o main.o $(CC) -o $@ $^ func.o : func.c $(CC) -o $@ -c $^ main.o : main.c $(CC) -o $@ -c $^ .PHONY : rebuild clean all rebuild : clean all all : $(TARGET) clean : rm *.o $(TARGET)
我們來看看編譯結果是否和之前的一樣的。
我們看到和之前的效果是一樣的,那么這樣做的好處是什么呢?在大型的項目中,我們后面難免會進行新功能的開發,那么此時寫的新文件便可以海子街放在目標之后,其他的不用管就OK了,這樣就非常方便。
下來我們來看看那些特殊變量的含義:a> $(MAKE) 是指當前 make 解釋器的文件名;b>$(MAKECMDGOALS) 是指命令行中指定的目標名(make 的命令行參數);c>$(MAKEFILE_LIST) 指 make 所需要處理的 makefile 文件列表,當前 makefile 的文件名總是位于列表的最后,文件名之間以空格進行分隔。
下來我們還是以代碼為例來進行說明
.PHONY : all out first second third test all out : @echo "$(MAKE)" @echo "$(MAKECMDGOALS)" @echo "$(MAKEFILE_LIST)" first : @echo "first" second : @echo "second" third : @echo "third" test : @$(MAKE) first @$(MAKE) second @$(MAKE) third
我們來看看編譯效果
我們第一次直接 make 的時候,因為當前解釋器是 make ,所以會直接打印 make,命令行后面沒帶參數,因此第二行是空的,最后一行是因為只有一個 makefile,但是在它前面會有一個空格。第二次 make all 的時候,因為命令行的參數為 all,所以第二行會輸出 all。第三次 make test 的時候,因為需要進行三次 MAKE,所以會有三次進入到對應目錄下進行進行 make 命令。第四次 make all out 的時候,在執行 all 的時候分別打印一次,在執行 out 的時候再次會打印一次。
下來我們來繼續看看另一些特殊變量的含義:a> $(MAKE_VERSION) 是指當面 make 解釋器的版本;b> $(CURDIR) 是指當前 make 解釋器的工作目錄;c> $(.VARIABLES) 是指所有已經定義的變量名列表(預定義變量和自定義變量)。
還是以代碼為例來進行說明
.PHONY : test1 test2 TDelphi := Delphi Tang D.T.Software := D.T. test1 : @echo "$(MAKE_VERSION)" @echo "$(CURDIR)" @echo "$(.VARIABLES)" test2 : @echo "$(RM)"
我們來看看編譯效果
我們看到直接 make 的時候,執行的是 test1 目標,先是打印當前 make 的版本,接著是當前目錄,然后是當前的環境變量。我們在下面用 make -v 直接看到當前 make 解釋器的版本就是 3.81,而且當前目錄就是 /mnt/hgfs/winshare/mentu/make1/5 。接著我們看到了我們自己定義的兩個環境變量。接下來在執行 make test2,看到 RM 其實就是 rm -f,就是強制刪除的符號,我們是不是就可以在前面定義的 makefile 中將 rm -f 全部替換為 $(RM) 呢。通過對 makefile 中的預定義變量的學習,總結如下:1、makefile 提供了預定義變量供開發者使用;2、預定義變量的使用能夠使得 makefile 的開發更高效;3、自動變量是 makefile 中最常見的元素;4、使用 $(.VARIABLES) 能夠獲取所有的特殊變量。
歡迎大家一起來學習 makefile,可以加我QQ:243343083。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。