Makefile
-
基本语法:
target: dependencies command-
目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。
-
默认情况下 Makefile 的第一个目标为终极目标。
-
注意每条命令之前必须有一个 tab 保持缩进
-
-
变量:
$表示引用变量的值$@表示目标文件$^表示所有依赖文件$<表示第一个依赖文件
-
运算符:
:=表示变量的值现在就展开=表示变量的值在 makefile 文件中被引用时才会展开?=表示如果变量到目前为止还没有被定义过,则定义它+=表示追加变量的值, 就是 c++中的a+=b等价于a=a+b
-
函数:
-
$(shell command)执行 shell 命令# 获取当前时间 TIME = $(shell date) -
$(wildcard pattern)展开通配符# 获取当前目录中的所有.c文件,并将它们的文件名列表赋值给SRC SRC = $(wildcard *.c) # 将所有.c文件的后缀替换为.o,生成目标文件的列表并赋值给OBJ OBJ = $(patsubst %.c, %.o, $(SRC)) # 定义默认目标,这通常是Makefile运行时的默认构建任务 ALL: hello.out # 规则用于生成可执行文件hello.out,它依赖于所有的目标文件(即$(OBJ)) hello.out: $(OBJ) gcc $(OBJ) -o hello.out # 使用GCC将目标文件链接为可执行文件 # 通用规则,用于将.c文件编译为.o文件 %.o: %.c gcc -c $< -o $@ # 使用GCC将源文件编译为目标文件,$<代表输入文件,$@代表输出文件
-
-
伪目标:
-
伪目标是指不对应任何实际文件的目标,只是一个标签,用于执行一系列命令。
.PHONY: clean # 声明clean为伪目标 clean: # clean伪目标的规则 rm -f *.o hello.out # 删除所有.o文件和可执行文件make clean # 执行clean伪目标的规则
-
-
嵌套 Makefile:
-
可以在 Makefile 中嵌套调用其他 Makefile。
subsystem: cd subdir && $(MAKE) # 其等价于: subsystem: $(MAKE) -C subdir
-
-
指定头文件,库文件路径:
# 指定头文件路径 CFLAGS = -I/usr/local/include # 指定库文件路径 LDFLAGS = -L/usr/local/lib