首页 文章

在makefile的$(SOURCES)中替换文件夹路径

提问于
浏览
2

我正在寻找一种方法来替换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}

这将按预期替换源文件的扩展名 .

最后,我想用“obj /”替换“src /”

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 :

1 回答

  • 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)))
    

相关问题