如何通过Makefile单条规则自动批量构建所有目标文件
Makefile单规则批量构建多目标文件实现方法
核心靠Make原生支持的模式规则+自动变量实现,不需要为每个.o文件单独写构建逻辑,步骤如下:
- 先把定义好的头文件目录列表,批量转成编译器识别的
-I参数格式,不用手动逐个拼接:
这个写法会把INC_FLAGS := $(patsubst %,-I%,$(INC))somedir/inc anotherdir/inc自动转换成-Isomedir/inc -Ianotherdir/inc。 - 写通用模式规则,用
%作为通配符匹配所有目标文件:
规则逻辑说明:%.o: %.cpp $(CXX) $(CXXFLAGS) $(INC_FLAGS) -c $< -o $@%会匹配任意非空字符串,构建a.o时会自动匹配到a,把依赖自动定位到同名的a.cpp;构建b.o时同理自动定位到b.cpp,新增目标文件时不需要修改这条规则。- 用到的自动变量与内置变量含义:
$@:指代当前正在构建的目标,比如构建a.o时它的值就是a.o$<:指代规则里的第一个依赖文件,也就是匹配到的对应.cpp源文件$(CXX):Make内置的C编译器变量,默认值为g++,需要换clang的话直接给这个变量赋值即可$(CXXFLAGS):Make内置的C++编译选项变量,可以自行添加-Wall -g -O2这类自定义编译参数
完整可直接使用的Makefile示例
# 基础配置 SRC = a.cpp b.cpp INC = somedir/inc anotherdir/inc OBJ = a.o b.o # 编译参数处理 INC_FLAGS := $(patsubst %,-I%,$(INC)) CXXFLAGS ?= -Wall -g -O2 # 单条通用规则覆盖所有.o目标构建 %.o: %.cpp $(CXX) $(CXXFLAGS) $(INC_FLAGS) -c $< -o $@ # 默认目标:直接执行make就构建所有OBJ列表里的文件 all: $(OBJ) # 清理规则 .PHONY: all clean clean: rm -f $(OBJ)
后续新增源文件的时候,只需要把新的.cpp文件名加到SRC、对应.o加到OBJ里就行,构建规则完全不需要改动。
内容的提问来源于stack exchange,提问作者Qian2501
相关产品推荐
相关产品推荐

