【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上
抓住基礎,學習更多技術,迎接挑戰,加qq:1126137994 微信:liu1126137994 一起學習更多技術~
上一篇文章學習了makefile中的預定義變量的使用,今天來繼續學習makefile中的變量!
1、變量值的替換
變量值的替換:
*使用指定字符(串),替換變量值中的后綴字符(串)
-語法格式:$(var:a=b) 或${var:a=b}.
注意事項:
- 替換表達式中不能有任何的空格
- make中支持使用${}對變量進行取值
舉個例子:
變量的模式替換:
*使用%保留變量值中的指定字符,替換其他字符
-語法格式:$(var:a%b=x%y) 或者 ${var:a%b=x%y}
注意事項:
- 替換表達式中不能有任何空格
- make中支持使用${}對變量進行取值
舉個例子深刻理解一下:
src: a1b.c a2b.c a3b.c obj: $(src:a%b.c=x%y)test:@echo "obj => $(obj)"下面給出一個簡單的示例來理解上面的語法:
src1 := a.cc b.cc c.cc obj1 := $(src1:cc=o)test :@echo "obj1 => $(obj1)"src2 := a11b.c a22b.c a33b.c obj2 := $(src2:a%b.c=x%y)test2 :@echo "obj2 => $(obj2)"輸入:make test
顯示:obj1 => a.o b.o c.o
輸入:make test2
顯示:obj2 => x11y x22y x33y
規則中的模式替換:
意義:
通過target-pattern 從tagets中匹配子目標;再通過prereq-pattern從子目標生成依賴;進而構成完整的規則!!!
下面是一個規則中的模式替換案例:
OBJS := func.o main.o $(OBJS) : %.o : %.cgcc -o $@ -c $^等價于下面的:
func.o : func.cgcc -o $@ -c $^ main.o : main.cgcc -o $@ -c $^下面看一個規則中的模式替換的案例:
main.c程序:
func.c程序
#include "stdio.h"extern char* g_hello;void foo() {printf("void foo() : %s\n", g_hello); }const.c程序:
const char* g_hello = "hello makefile";上述三個程序為源程序,編譯他們的makefile文件為:
CC := g++ TARGET := hello-makefile.out OBJS := func.o main.o const.o$(TARGET) : $(OBJS)$(CC) -o $@ $^$(OBJS) : %.o : %.c$(CC) -o $@ -c $^.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)clean :$(RM) *.o $(TARGET)輸入make進行編譯:
顯示:g++ -o hello-makefile.out func.o main.o const.o
執行生成的可執行文件:
./hello-makefile.out
顯示:
void foo() : hello makefile
2、變量值的嵌套引用
變量值的嵌套引用:
*一個變量名之中,可以包含對其他變量的引用
*嵌套引用的本質是用一個變量表示另外一個變量
命令行變量:
*運行make時,在命令行定義變量
*命令行變量默認覆蓋makefile中定義的變量
override關鍵字:
*用于指示makefile中定義的變量不能被覆蓋
*變量的定義和賦值都需要用override關鍵字
define關鍵字:
*用于在makefile中定義多行變量
*多行變量的定義從變量名開始,到endef結束
*可使用override關鍵字防止定義的變量被覆蓋
*define定義的變量等價于使用 “=” 定義的變量(遞歸賦值)
下面給出一個例子來理解上述的語法理論:
hm := hello makefileoverride var := override-testdefine foo I'm fool! endefoverride define cmd@echo "run cmd ls ..."@ls endeftest :@echo "hm => $(hm)"@echo "var => $(var)"@echo "foo => $(foo)"${cmd}輸入make,顯示:
3、總結
- 變量值的替換($(var:a=b) 或者 ${var:a=b} )
- 變量的模式替換($(var:a%b=x%y) 或者 ${var:a%b=x%y})
- makefile支持將模式替換直接用在規則中
- makefile中的變量值可以嵌套使用
- 命令行中定義的變量可以覆蓋makefile中的變量
- override用于指示makefile中的變量不能被覆蓋
- define用于makefile中定義值為多行的變量
想一起探討以及獲得各種學習資源加我:
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
本學習記錄完全來源于狄泰軟件學院的相關課程,可以加我q:1126137994或者Q群:199546072 ,給你推薦更多學習課程。
總結
以上是生活随笔為你收集整理的【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome不能安装adblock插件
- 下一篇: @软考考生,你要的软考论文写作技巧和论文