Makefile 是一个用于自动化编译和构建软件项目的文件。它使用规则来定义如何从源文件生成目标文件。模式规则是一种 Makefile 规则,它允许你定义一种模式,然后应用于多个文件。%
是一个通配符,代表任意长度的字符串。
模式规则主要有以下几种类型:
假设你有一个项目,包含多个 C 源文件,每个源文件都需要编译成对象文件,然后链接成最终的可执行文件。你可以使用模式规则来简化这个过程。
假设有以下目录结构:
project/
├── src/
│ ├── main.c
│ ├── module1.c
│ └── module2.c
├── obj/
│ ├── main.o
│ ├── module1.o
│ └── module2.o
└── Makefile
Makefile 内容如下:
# 定义源文件和目标文件的路径
SRC_DIR = src
OBJ_DIR = obj
TARGET = myprogram
# 获取所有源文件
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
OBJ_FILES = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC_FILES))
# 模式规则:编译 C 文件为对象文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) -c $< -o $@
# 创建目标目录
$(OBJ_DIR):
mkdir -p $(OBJ_DIR)
# 链接对象文件生成可执行文件
$(TARGET): $(OBJ_FILES)
$(CC) $^ -o $@
# 清理生成的文件
clean:
rm -rf $(OBJ_DIR) $(TARGET)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
定义了一个模式规则,表示从 $(SRC_DIR)
目录下的任意 .c
文件生成 $(OBJ_DIR)
目录下的对应 .o
文件。%
代表任意长度的字符串,因此这个规则可以应用于所有 .c
文件。$<
表示第一个依赖文件,$^
表示所有依赖文件。$(OBJ_DIR):
规则确保目标目录存在。原因:可能是由于 Makefile 中的其他规则优先级更高,或者模式规则的依赖关系没有正确设置。
解决方法:
override
关键字确保模式规则优先级最高。override $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) -c $< -o $@
通过以上方法,可以有效地使用 Makefile 中的模式规则来简化构建过程,并解决相关问题。
领取专属 10元无门槛券
手把手带您无忧上云