我正在寻找一种方法来替换makefile中源文件变量列表中的文件夹。
这里有什么用吗?
我首先找到我的源文件
program_C_SRCS := $(wildcard $(SRCDIR)/*.c)
program_CXX_SRCS := $(wildcard $(SRCDIR)/*.cpp)
结果(如果我正确理解GNU makefile)看起来通常像
的src / main.cpp中
SRC / sensor.cpp
然后我按目标文件构建
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.opp}
这将按预期替换源文件的扩展名。
最后,我想替换" src /"用" obj /"
program_C_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_C_OBJS)}
program_CXX_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_CXX_OBJS)}
然而,这不起作用。
我通过GNU makefile网站无济于事。此解决方案Makefile to put object files from source files different directories into a single, separate directory?已关闭,但对象目录必须明确包含在任何位置,并且sources目录不包含源路径信息。
在我的makefile中,源文件列表包含路径,我希望目标文件列表也包含相应的对象目录。
makefile的其余部分也尝试使用变量
链接阶段
$(program_NAME): $(program_OBJS)
$(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(program_OBJS) -o "$(program_NAME)"
编译阶段
%.opp : %.cpp | mkdirobjdir
$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o "$@" "$<"
最后是规则
main_enose.opp : main_enose.cpp core_enose.cpp core_enose.h
$(OBJDIR)/core_enose.opp : core_enose.cpp core_enose.h
$(OBJDIR)/core_enose.h :
答案 0 :(得分:2)
这里的问题是$(subst)
来电中逗号周围的空格。 make并不是按照你期望的方式忽略它们。它将它们视为要查找的字符串中的文字值,要替换的字符串以及要替换的字符串。
删除它们。
program_C_OBJPATH := ${subst $(SRCDIR),$(OBJDIR),$(program_C_OBJS)}
program_CXX_OBJPATH := ${subst $(SRCDIR),$(OBJDIR),$(program_CXX_OBJS)}
那说你可能要么使用$(patsubst)
来限制替换的发生位置:
program_C_OBJPATH := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(program_C_OBJS))
program_CXX_OBJPATH := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(program_CXX_OBJS))
或者您希望使用$(notdir)
和$(addprefix)
来处理剥离所有目录信息并将其添加回来:
program_C_OBJPATH := $(addprefix $(OBJDIR)/,$(notdir $(program_C_OBJS)))
program_CXX_OBJPATH := $(addprefix $(OBJDIR)/,$(notdir $(program_CXX_OBJS)))