Makefile是一種編譯控制文件,廣泛用于項(xiàng)目的自動(dòng)化構(gòu)建。它定義了一系列的規(guī)則來(lái)指導(dǎo)構(gòu)建的過(guò)程。通過(guò)Makefile,開(kāi)發(fā)者可以輕松管理大型項(xiàng)目的編譯鏈接、清理等任務(wù)。本文將從Makefile的基礎(chǔ)用法講起,逐步深入到更高級(jí)的應(yīng)用,為你呈現(xiàn)一個(gè)全面而詳細(xì)的Makefile使用手冊(cè)。
第一:Makefile的基本結(jié)構(gòu)
一個(gè)最簡(jiǎn)單的Makefile包含規(guī)則,規(guī)則由目標(biāo)(target)、依賴(dependencies)和命令(commands)三部分組成:
target: dependencies commands
命令前的Tab鍵是必須的。下面是一個(gè)簡(jiǎn)單的示例:
hello: hello.c gcc -o hello hello.c
第二:變量的使用
在Makefile中聲明變量可以使得我們的代碼更加簡(jiǎn)潔。
CC=gccCFLAGS=-std=c99LDFLAGS=OBJ=main.o utils.oapp: $(OBJ) $(CC) -o app $(OBJ) $(LDFLAGS)main.o: main.c $(CC) $(CFLAGS) -c main.cutils.o: utils.c utils.h $(CC) $(CFLAGS) -c utils.c
第三:通用規(guī)則和模式匹配
模式規(guī)則可以減少我們重復(fù)相同命令的工作量。
%.o: %.c $(CC) $(CFLAGS) -c $<
$
第四:自動(dòng)化變量
Makefile提供了一系列自動(dòng)化變量,它們?cè)谝?guī)則的命令中非常有用:
$@表示規(guī)則中的目標(biāo)文件名;
$^表示所有的依賴文件列表;
$
$?表示所有比目標(biāo)新的依賴文件列表。
第五:函數(shù)的使用
Makefile中內(nèi)置了許多函數(shù),用以執(zhí)行字符串操作、文件操作等。
例如,獲取源文件列表:
SRC=$(wildcard *.c)OBJ=$(patsubst %.c,%.o,$(SRC))
第六:控制Make的行為
make -B強(qiáng)制重新編譯所有目標(biāo);
make -n顯示將要執(zhí)行的命令而不實(shí)際執(zhí)行;
make -f 指定使用其他名稱的Makefile文件;
make -j允許并行執(zhí)行(多核編譯)。
第七:高級(jí)用法 - 條件判斷
Makefile也支持條件判斷,這在不同環(huán)境需要執(zhí)行不同命令時(shí)非常有用。
ifeq ($(OS),Windows_NT) RM=del /Qelse RM=rm -fendifclean: $(RM) *.o
第八:使用變量和文件包含來(lái)組織Makefile
對(duì)于大型項(xiàng)目,組織多個(gè)Makefile是一種好方法。
# 在子Makefile中include config.mk
第九:自定義函數(shù)
通過(guò)定義可以重用的函數(shù),你可以使你的Makefile變得更加強(qiáng)大和靈活。
define run-cc$(CC) $(CFLAGS) -o $@ $^endefapp: $(OBJ) $(call run-cc)
第十:處理多目標(biāo)
定義一個(gè)規(guī)則來(lái)批量處理多個(gè)文件。
FILES := file1 file2 file3all: $(FILES)$(FILES): touch $@
第十一:偽目標(biāo)的使用
偽目標(biāo)不代表實(shí)際的文件,它只是一個(gè)動(dòng)作的名稱。
.PHONY: cleanclean: rm -f *.o app
第十二:調(diào)試Makefile
你可以使用make --debug或添加注釋來(lái)幫助調(diào)試Makefile。
app: main.o utils.o # 這是一個(gè)鏈接的命令 $(CC) -o app main.o utils.o
結(jié)語(yǔ)
Makefile是構(gòu)建自動(dòng)化的強(qiáng)大工具,既可以簡(jiǎn)化小型項(xiàng)目的構(gòu)建流程,也能夠靈活管理大型應(yīng)用程序的復(fù)雜構(gòu)建系統(tǒng)。通過(guò)本文的詳細(xì)論述和豐富示例,您應(yīng)該能夠基本掌握Makefile的各項(xiàng)技能,并在實(shí)際項(xiàng)目中加以應(yīng)用。
希望以上內(nèi)容對(duì)你深入理解和使用Makefile有所幫助。記住,“實(shí)踐出真知”——編寫你自己的Makefile并嘗試使用這些特性是最好的學(xué)習(xí)方式。
審核編輯 黃宇
-
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208949 -
Makefile
+關(guān)注
關(guān)注
1文章
125瀏覽量
19163
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論