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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

發(fā)布時間:2023/11/28 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 變量的定義

Makefile 文件中定義變量的基本語法如下:

 變量的名稱=值列表

變量的名稱可以由大小寫字母、阿拉伯?dāng)?shù)字和下劃線構(gòu)成。等號左右的空白符沒有明確的要求,因為在執(zhí)行 make 的時候多余的空白符會被自動的刪除。至于值列表,既可以是零項,又可以是一項或者是多項。如:

 name_list = aa bb cc

調(diào)用變量的時候可以用 $(name_list) 或者是 ${name_list} 來替換,這就是變量的引用。實例:

OBJ=main.o test1.o test2.o test3.o
test:$(OBJ)gcc -o test $(OBJ)

當(dāng)要添加或者是刪除某個依賴文件的時候,我們只需要改變變量 OBJ 的值就可以了。

2. 變量的賦值

Makefile 的變量的四種基本賦值方式:

  • 簡單賦值 ( := ) 編程語言中常規(guī)理解的賦值方式,只對當(dāng)前語句的變量有效。
  • 遞歸賦值 ( = ) 賦值語句可能影響多個變量,所有目標(biāo)變量相關(guān)的其他變量都受影響。
  • 條件賦值 ( ?=) 如果變量未定義,則使用符號中的值定義變量。如果該變量已經(jīng)賦值,則該賦值語句無效。
  • 追加賦值 ( += ) 原變量用空格隔開的方式追加一個新值。

2.1 簡單賦值

編寫 Makefile

x := a
y := $(x)b
x := cc
all:echo "x=>$(x)"echo "y=>$(y)"

終端輸入 make 查看結(jié)果

echo "x=>cc"
x=>cc
echo "y=>ab"
y=>ab

變量 y 只與之前定義的 x 相關(guān),不管 x 之后是否有變化。

2.2 遞歸賦值

編寫 Makefile

x = a
y = $(x)b
x = cc
test:echo "x=>$(x)"echo "y=>$(y)"

終端輸入 make 查看結(jié)果

echo "x=>cc"
x=>cc
echo "y=>ccb"
y=>ccb

變量 y 與最新的 x 值相關(guān)。

2.3 條件賦值

編寫 Makefile

x = a
y = $(x)b
x ?= cc
test:echo "x=>$(x)"echo "y=>$(y)"

終端輸入 make 查看結(jié)果

echo "x=>a"
x=>a
echo "y=>ab"
y=>ab

在定義 x ?= cc 之前 x 已經(jīng)定義過,所以該行不生效。

編寫 Makefile

#x = a
y = $(x)b
x ?= cc
test:echo "x=>$(x)"echo "y=>$(y)"

終端輸入 make 查看結(jié)果

echo "x=>cc"
x=>cc
echo "y=>ccb"
y=>ccb

2.4 追加賦值

編寫 Makefile

x = a
y = $(x)b
x += cc
test:echo "x=>$(x)"echo "y=>$(y)"

終端輸入 make 查看結(jié)果

echo "x=>a cc"
x=>a cc
echo "y=>a ccb"
y=>a ccb

3. 自動變量

關(guān)于自動化變量可以理解為由 Makefile 自動產(chǎn)生的變量。自動化變量的取值根據(jù)執(zhí)行的規(guī)則來決定,取決于執(zhí)行規(guī)則的目標(biāo)文件和依賴文件。下面是對所有的自動化變量進行的說明:

自動化變量說明
$@表示規(guī)則的目標(biāo)文件名。如果目標(biāo)是一個文檔文件(Linux 中,一般成 .a 文件為文檔文件,也成為靜態(tài)的庫文件),那么它代表這個文檔的文件名。在多目標(biāo)模式規(guī)則中,它代表的是觸發(fā)規(guī)則被執(zhí)行的文件名。
$%當(dāng)目標(biāo)文件是一個靜態(tài)庫文件時,代表靜態(tài)庫的一個成員名。
$<規(guī)則的第一個依賴的文件名。如果是一個目標(biāo)文件使用隱含的規(guī)則來重建,則它代表由隱含規(guī)則加入的第一個依賴文件。
$?所有比目標(biāo)文件更新的依賴文件列表,空格分隔。如果目標(biāo)文件時靜態(tài)庫文件,代表的是庫文件(.o 文件)。
$^代表的是所有依賴文件列表,使用空格分隔。如果目標(biāo)是靜態(tài)庫文件,它所代表的只能是所有的庫成員(.o 文件)名。一個文件可重復(fù)的出現(xiàn)在目標(biāo)的依賴中,變量 $^只記錄它的第一次引用的情況。就是說變量$^會去掉重復(fù)的依賴文件。
$+類似$^,但是它保留了依賴文件中重復(fù)出現(xiàn)的文件。主要用在程序鏈接時庫的交叉引用場合。
$*在模式規(guī)則和靜態(tài)模式規(guī)則中,代表“莖”。“莖”是目標(biāo)模式中“%”所代表的部分(當(dāng)文件名中存在目錄時,“莖”也包含目錄部分)。
main: main.o   name.o greeting.og++ $^ -o $@
main.o: main.cppg++ -c $^ -o $@
name.o: name.cppg++ -c $< -o $@
greeting.o: greeting.cpp greeting.hg++ -c $< -o $@

對比之前寫的 Makefile 中的命令,我們可以發(fā)現(xiàn)

  • $@ 代表的是目標(biāo)文件;
  • $^ 代表的是所有依賴的文件;
  • $< 代表的是依賴文件中的第一個;

我們在執(zhí)行 make 的時候,make 會自動識別命令中的自動變量,并自動實現(xiàn)自動化變量中的值的替換。

make 中在這些變量中加入字符 D 或者 F 就形成了一系列變種的自動化變量,這些自動化變量可以對文件的名稱進行操作。

4. 變量覆蓋 override

作用是使 Makefile 中定義的變量能夠覆蓋 make 命令參數(shù)中指定的變量

語法:

override <variable> = <value>
override <variable> := <value>
override <variable> += <value>

下面通過一個例子體會 override 的作用:

  1. Makefile 內(nèi)容 (沒有用 override)

SRCS = a.cpp b.cpp all:echo "SRCS is $(SRCS)"

執(zhí)行 make 結(jié)果:

wohu@ubuntu:~/cpp/func$ make SRCS=c.cpp
echo "SRCS is c.cpp"
SRCS is c.cpp
wohu@ubuntu:~/cpp/func$ 
  1. Makefile 內(nèi)容 (用 override)
override SRCS = a.cpp b.cpp all:echo "SRCS is $(SRCS)"

執(zhí)行 make 結(jié)果:

wohu@ubuntu:~/cpp/func$ make SRCS=c.cpp
echo "SRCS is a.cpp b.cpp "
SRCS is a.cpp b.cpp 
wohu@ubuntu:~/cpp/func$ 

5. 判斷變量的來源

語法:

$(origin <variable>)

返回值有如下類型:

類型含義
undefined沒有定義過
default是個默認(rèn)的定義, 比如 CC 變量
environment是個環(huán)境變量, 并且 make時沒有使用 -e 參數(shù)
file定義在 Makefile 中
command line定義在命令行中
override被 override 重新定義過
automatic是自動化變量

示例:

# Makefile 內(nèi)容
val-in-file := test-file
override val-override := test-overrideall:@echo $(origin not-define)    # not-define 沒有定義@echo $(origin CC)            # CC 是Makefile默認(rèn)定義的變量@echo $(origin PATH)         # PATH 是 bash 環(huán)境變量@echo $(origin val-in-file)    # 此Makefile中定義的變量@echo $(origin val-in-cmd)    # 這個變量會加在 make 的參數(shù)中@echo $(origin val-override) # 此Makefile中定義的override變量@echo $(origin @)             # 自動變量, 具體前面的介紹

執(zhí)行 make

$ make val-in-cmd=val-cmd
undefined
default
environment
file
command line
override
automatic

總結(jié)

以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。