一、makefile 變量概述
makefile 變量是一些被賦值的標識符(Identifier),它們用於儲存各種用到的字符串或者數值。這些變量可以是自己定義的,也可以是系統默認的。在 makefile 中,變量是用於存放一些封裝的命令或者路徑信息等動態的信息。
默認情況下,make 命令會根據系統環境變量的不同而提供一些默認變量,我們也可以通過 makefile 進行自定義變量,從而實現模塊化的編程思路。
二、變量的賦值和引用
makefile 變量的基本操作包括其賦值和引用。變量的賦值使用“=”符號,如下所示:
CC=gcc
這段代碼為 CC 賦值為 gcc。
變量的引用則使用“$”符號,如下所示:
$(CC) -o test test.c
這段代碼中,將通過變量 CC 來引用 gcc 編譯器。
在 makefile 中,還可以通過“:=”符號進行變量的延遲賦值。如下所示:
OBJECTS := OBJECTS += main.o
這段代碼中,OBJECTS 變量先被賦值為空,後來 += 符號是在不斷地向 OBJECTS 變量中添加 main.o 目標文件。這樣就可以通過變量 OBJECTS 直接引用所有目標文件了。
三、預定義變量
為了方便程序員編寫 makefile,GNU make 已經提供了一些預定義變量,程序員可以直接引用這些變量。下面是一些 GNU make 的常用預定義變量:
$(CC)
:C 語言編譯器$(CFLAGS)
:C 語言編譯器參數$(CPP)
:C++ 語言編譯器$(CXXFLAGS)
:C++ 語言編譯器參數$(AR)
:C 語言庫文件打包命令$(ARFLAGS)
:C 語言庫文件打包命令參數$(LD)
:鏈接器$(LDFLAGS)
:鏈接器參數
四、函數式變量
makefile 中還提供了很多系統內置的函數,通過這些函數可以實現很多高級的功能。比如 $(wildcard)
函數可以查找當前工作目錄下的所有文件,$(patsubst)
函數可以將源文件路徑和目標文件路徑匹配。
函數式變量的語法形式如下:
$(function arguments)
其中,function 代表函數名,arguments 代表參數。下面是系統內置的一些函數:
$(strip string)
:去除字符串中的空格$(subst old,new,text)
:將 text 字符串中的 old 字符串替換成 new 字符串$(patsubst pattern,replacement,text)
:將 text 字符串中按照 pattern 模式匹配的內容替換成 replacement 字符串$(wildcard pattern)
:查找當前工作目錄下所有符合 pattern 模式的文件名$(foreach var,list,text)
:將 list 中每個元素進行處理,並賦值給 var 變量,並將結果拼接起來$(shell command)
:執行一個 shell 命令,並返回其結果
五、自定義變量
為了使 makefile 更加模塊化,我們可以在 makefile 中自定義一些變量。
下面是一個例子,展示在 makefile 中如何自定義變量:
INC_DIR = include LIB_DIR = lib SRC_DIR = src CFLAGS = -I$(INC_DIR) all:$(LIB_DIR)/libfoo.a $(LIB_DIR)/libfoo.a:$(SRC_DIR)/foo.c gcc -c $(SRC_DIR)/foo.c $(CFLAGS) -o $(LIB_DIR)/foo.o ar r $(LIB_DIR)/libfoo.a $(LIB_DIR)/foo.o
這段代碼中,定義了三個自定義變量:INC_DIR,LIB_DIR 和 SRC_DIR,分別表示頭文件目錄,庫文件目錄和源代碼目錄。另外,CFLAGS 變量也被設置為了 -I$(INC_DIR),這樣就可以使編譯器能夠找到 INC_DIR 目錄中的頭文件。
在 all 發展中,引用了 $(LIB_DIR)/libfoo.a 變量,並將其作為 all 的最終目標。
六、總結
本文對 makefile 變量進行了詳細的剖析,包括了變量的賦值和引用,預定義變量,函數式變量和自定義變量等方面的內容。了解這些知識點,可以讓我們更好地編寫 makefile,提高編程效率。
原創文章,作者:NMFGG,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331252.html