Ubuntu下Makefile遍历变量内文件批量生成.o文件的方法
当然可以遍历CPPS变量里的所有文件啦!针对你要在Makefile所在目录生成对应.o文件的需求,我给你两个实用的方案,你可以根据场景选择:
方案1:直接在Makefile中生成当前目录的.o(无需创建链接)
这是最干净的方案,不需要额外创建软链接,直接通过Makefile的内置函数和规则实现编译输出到当前目录。
假设你的CPPS变量已经定义好了(比如CPPS = src/core.cpp utils/helper.cpp test/demo.cpp),可以这样写Makefile:
# 定义源文件列表 CPPS = src/core.cpp utils/helper.cpp test/demo.cpp # 生成目标.o文件列表:去掉源文件的路径,保留文件名并替换成.o OBJS := $(notdir $(CPPS:.cpp=.o)) # 编译选项,可根据需求添加(比如-Wall -g等) CXXFLAGS := -Wall -g # 静态模式规则:匹配每个.o文件,找到对应的源文件并编译 $(OBJS): %.o: $(CXX) $(CXXFLAGS) -c $(filter %/$*.cpp,$(CPPS)) -o $@ # 默认目标 all: $(OBJS) # 清理生成的文件 clean: rm -f $(OBJS)
关键解释:
$(notdir $(CPPS:.cpp=.o)):把每个源文件的路径去掉,将.cpp后缀替换为.o,比如src/core.cpp会变成core.o$(filter %/$*.cpp,$(CPPS)):从CPPS列表中筛选出对应名字的源文件($*代表当前目标的文件名前缀,比如core.o对应的$*是core,所以会匹配%/core.cpp)- 编译命令直接将找到的源文件编译成当前目录的
.o文件
如果需要自动处理头文件依赖,可以给CXXFLAGS加上-MMD -MP,并引入生成的.d文件:
CXXFLAGS := -Wall -g -MMD -MP -include $(OBJS:.o=.d)
方案2:通过脚本遍历CPPS创建软链接后编译
如果你确实需要在当前目录有这些源文件的链接(比如其他工具依赖),可以在Makefile中添加一个目标来自动生成软链接:
# 定义源文件列表 CPPS = src/core.cpp utils/helper.cpp test/demo.cpp # 生成目标.o文件列表 OBJS := $(notdir $(CPPS:.cpp=.o)) # 编译选项 CXXFLAGS := -Wall -g # 创建软链接的目标:遍历CPPS中的每个文件,在当前目录创建软链接 create_links: @for cpp_file in $(CPPS); do \ ln -sf $$cpp_file $(notdir $$cpp_file); \ done # 默认目标:先创建链接,再编译 all: create_links $(OBJS) # 常规的.cpp到.o的编译规则 %.o: %.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ # 清理生成的链接和.o文件 clean: rm -f $(OBJS) $(notdir $(CPPS))
关键解释:
ln -sf:创建软链接,-s表示软链接,-f表示如果已有同名文件则覆盖- 遍历
CPPS中的每个文件,用$(notdir)获取文件名,在当前目录创建指向原文件的软链接 - 编译时直接用当前目录的链接文件生成
.o
方案对比:
- 方案1更推荐:没有额外的链接文件,避免路径变化导致链接失效的问题,编译逻辑更直接
- 方案2适合必须在当前目录有源文件副本/链接的场景,但需要注意清理时要删掉生成的链接
内容的提问来源于stack exchange,提问作者camino
相关产品推荐
相关产品推荐

