日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Makefile由浅入深完全学习记录6】Makefile中变量的高级主题上 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

抓住基礎,學習更多技術,迎接挑戰,加qq:1126137994 微信:liu1126137994 一起學習更多技術~

上一篇文章學習了makefile中的預定義變量的使用,今天來繼續學習makefile中的變量!

1、變量值的替換

變量值的替換:
*使用指定字符(串),替換變量值中的后綴字符(串)
-語法格式:$(var:a=b) 或${var:a=b}.
注意事項:

  • 替換表達式中不能有任何的空格
  • make中支持使用${}對變量進行取值
    舉個例子:
src := a.o b.o c.o obj := $(src:cc=o)test:@echo "obj => $(obj)"

變量的模式替換:

*使用%保留變量值中的指定字符,替換其他字符
-語法格式:$(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程序:

extern void foo();int main() {foo();return 0; }

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中变量的高级主题上的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。