【Linux操作系統(tǒng)】makefile入門:一個規(guī)則-兩個函數(shù)-三個變量

大家好,今天給大家介紹makefile入門:一個規(guī)則-兩個函數(shù)-三個變量,下方附有本文涉及的全部資料和源代碼的獲取方式,可進群免費領(lǐng)取。

1. 一個規(guī)則

1.1 規(guī)則解釋

Makefile由一系列規(guī)則組成,每個規(guī)則定義了一個目標(biāo)(target),以及生成該目標(biāo)所需的依賴項(dependencies)和生成命令(recipe)

當(dāng)目標(biāo)的依賴項發(fā)生變化時,Makefile會根據(jù)規(guī)則自動執(zhí)行生成命令,更新目標(biāo)。

Makefile規(guī)則的基本格式如下:

target: dependencies
    recipe
  • target是規(guī)則的目標(biāo),即要生成的文件或執(zhí)行的操作。可以是一個文件名、一個標(biāo)簽(例如all),或者一個偽目標(biāo)(以.PHONY聲明)。
  • dependencies是目標(biāo)所依賴的文件或目標(biāo)。當(dāng)任何一個依賴項發(fā)生變化時,Make工具會重新構(gòu)建目標(biāo)。
  • recipe是生成目標(biāo)的命令序列。每個命令都必須以Tab鍵開頭,并且在同一行上。可以是編譯、鏈接、復(fù)制文件等任何Shell命令。

Makefile中可以有多個規(guī)則,每個規(guī)則獨占一行。Make工具會根據(jù)規(guī)則的依賴關(guān)系自動確定構(gòu)建順序。

另外,Makefile還支持一些特殊的目標(biāo)和變量:

  • .PHONY:聲明一個偽目標(biāo),表示該目標(biāo)不對應(yīng)任何實際的文件。通常用于定義一些特殊的操作,如clean
  • .DEFAULT_GOAL:定義默認的目標(biāo)。如果沒有指定目標(biāo),則默認構(gòu)建該目標(biāo)。
  • $(CC):定義變量。可以在Makefile中使用變量來代替常用的命令和選項,方便管理和修改。

需要注意的是,Makefile中的規(guī)則和命令必須嚴格遵循縮進規(guī)則,命令必須以Tab鍵開頭。否則,Make工具可能無法正確解析和執(zhí)行。


1.2 規(guī)則舉例

下面是一個簡單的Makefile示例:

CC = gcc
CFLAGS = -Wall -g all: hello hello: main.o hello.o $(CC) $(CFLAGS) -o hello main.o hello.o main.o: main.c $(CC) $(CFLAGS) -c main.c hello.o: hello.c $(CC) $(CFLAGS) -c hello.c clean: rm -f hello *.o

1.3 代碼解釋

這個Makefile定義了一個目標(biāo)all,它依賴于目標(biāo)hello。目標(biāo)hello又依賴于目標(biāo)main.ohello.o。這些目標(biāo)之間的依賴關(guān)系告訴Make工具在構(gòu)建目標(biāo)hello之前需要先構(gòu)建main.ohello.o

每個目標(biāo)下面的生成命令使用Tab鍵縮進,這是Makefile的語法要求。在這個例子中,生成命令使用$(CC)$(CFLAGS)變量來指定編譯器和編譯選項。

除了上面的規(guī)則外,還定義了一個目標(biāo)clean,用于清理生成的目標(biāo)文件和可執(zhí)行文件。

使用這個Makefile,可以在終端中執(zhí)行以下命令:

  • make:構(gòu)建所有目標(biāo),默認會構(gòu)建all目標(biāo),即hello
  • make hello:構(gòu)建hello目標(biāo)。
  • make clean:清理生成的目標(biāo)文件和可執(zhí)行文件。

執(zhí)行make命令時,Make工具會根據(jù)目標(biāo)和依賴關(guān)系判斷哪些文件需要重新編譯,然后執(zhí)行相應(yīng)的生成命令。如果目標(biāo)已經(jīng)是最新的,Make工具會跳過它的構(gòu)建。

當(dāng)執(zhí)行make命令后,如果源文件沒有修改,Make工具會輸出類似于以下的結(jié)果:

make: 'hello' is up to date.

這表示目標(biāo)已經(jīng)是最新的,沒有需要重新構(gòu)建的文件。

如果執(zhí)行make clean命令,Make工具會執(zhí)行清理操作,刪除生成的目標(biāo)文件和可執(zhí)行文件。


2. 兩個函數(shù)

在Makefile中,除了$(wildcard pattern)函數(shù),還有一個常用的函數(shù)$(patsubst pattern,replacement,text)。它用于將指定文本中符合模式的部分替換為指定的字符串。

下面分別介紹$(wildcard pattern)$(patsubst pattern,replacement,text)函數(shù)的用法和示例:

2.1 $(wildcard pattern)

$(wildcard pattern)函數(shù)用于匹配文件名模式,返回符合模式的文件列表。

例如,假設(shè)當(dāng)前目錄下有以下文件:file1.txtfile2.txtfile3.dat

FILES := $(wildcard *.txt) all: @echo $(FILES)

運行make命令后,輸出結(jié)果為:

file1.txt file2.txt

解釋$(wildcard *.txt)匹配當(dāng)前目錄下所有以.txt結(jié)尾的文件,返回文件列表file1.txtfile2.txt。然后,$(FILES)將文件列表賦值給變量FILES,最后在all目標(biāo)中使用@echo命令輸出變量FILES的值。


2.2 $(patsubst pattern,replacement,text)

$(patsubst pattern,replacement,text)函數(shù)用于將指定文本中符合模式的部分替換為指定的字符串。

例如,假設(shè)有一個包含文件名的列表FILES,需要將其中的.txt替換為.o

FILES := file1.txt file2.txt file3.dat
TARGETS := $(patsubst %.txt,%.o,$(FILES)) all: $(TARGETS) %.o: %.txt @echo Generating $@ from $< @touch $@

運行make命令后,輸出結(jié)果為:

Generating file1.o from file1.txt Generating file2.o from file2.txt

解釋$(patsubst %.txt,%.o,$(FILES))將列表$(FILES)中以.txt結(jié)尾的文件名替換為以.o結(jié)尾的文件名,生成一個新的文件列表TARGETS,即file1.ofile2.ofile3.dat。然后,在all目標(biāo)中使用$(TARGETS)作為依賴項,為每個.txt文件生成一個.o文件。


3. 三個變量

在Makefile中,有三個常用的變量:$@$<$^。它們分別表示目標(biāo)文件、第一個依賴文件和所有依賴文件的列表。

下面分別介紹這三個變量的用法和示例:

3.1 $@

$@表示目標(biāo)文件,即當(dāng)前規(guī)則中的目標(biāo)。

例如,假設(shè)有一個規(guī)則如下所示:

all: main.o utils.o gcc $^ -o $@

運行make命令后,輸出結(jié)果為:

gcc main.o utils.o -o all

解釋:$^表示所有的依賴文件,即main.outils.o$@表示目標(biāo)文件,即all。在這個規(guī)則中,gcc $^ -o $@命令將所有的依賴文件編譯鏈接成一個可執(zhí)行文件all

3.2 $<

lt;

$<表示第一個依賴文件,即當(dāng)前規(guī)則中的第一個依賴文件。

例如,假設(shè)有一個規(guī)則如下所示:

main.o: main.c gcc -c $<

運行make命令后,輸出結(jié)果為:

gcc -c main.c

解釋:$<表示第一個依賴文件,即main.c。在這個規(guī)則中,gcc -c $<命令將main.c文件編譯成目標(biāo)文件main.o


3.3 $^

$^表示所有的依賴文件的列表。

例如,假設(shè)有一個規(guī)則如下所示:

all: main.o utils.o gcc $^ -o $@

運行make命令后,輸出結(jié)果為:

gcc main.o utils.o -o all

解釋:$^表示所有的依賴文件,即main.outils.o$@表示目標(biāo)文件,即all。在這個規(guī)則中,gcc $^ -o $@命令將所有的依賴文件編譯鏈接成一個可執(zhí)行文件all


總結(jié)

綜上所述,makefile中的一個規(guī)則,兩個函數(shù)和三個自動變量是我們在Linux開發(fā)中經(jīng)常使用的重要工具。通過靈活運用這些工具,我們可以更高效地構(gòu)建和管理項目,提高開發(fā)效率。

完整資料可進群免費領(lǐng)取!!!

the end

評論(0)