You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:14:58