【问题标题】:Makefile string substitution in dependency not working依赖项中的Makefile字符串替换不起作用
【发布时间】:2012-12-07 02:03:04
【问题描述】:

我有一个文件夹结构,我的所有源文件都在 ./src/ 中,我所有的目标文件都在 ./obj/ 中(具有相同的内部目录结构,使用路径替换进行镜像)。我创建了以下生成文件:

$(EXECUTABLE): $(OBJECTS)
    @echo Linking $(EXECUTABLE)...
    $(CXX) $(LDLIBS) $(OBJECTS) -o $(EXECUTABLE)

%.o: $(subst o,cpp,$(subst obj/,src/,$@))
    @echo Building $@...
    $(CXX) $(CPPFLAGS) -c $(subst o,cpp,$(subst obj/,src/,$@)) -o $@

这不起作用! Make 一直声称目标文件是最新的,即使源文件实际上比目标文件更旧。另一方面,如果我这样做:

obj/main.o: src/main.cpp
    @echo Building $@...
    $(CXX) $(CPPFLAGS) -c src/main.cpp -o $@

对于每个源文件,它都能完美运行。我检查了一下,两个subst 给出了相同的结果(obj/main.o 变成了 src/main.cpp 符合预期)。然而 Make 出于某种原因不接受依赖。

这让我很伤心,有人可以解释我哪里出错了吗?我不明白发生了什么,我认为我的替换会起作用,因为它给出了相同的输出。我不允许在依赖项中使用subst$@ 吗?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    您不能在先决条件中使用$@,只能在命令中使用。

    但你可以这样做:

    $(OBJECTS): obj/%.o : src/%.cpp
        @echo Building $@ from $<...
        $(CXX) $(CPPFLAGS) -c $< -o $@
    

    【讨论】:

    • 非常有用的例子。
    猜你喜欢
    • 2012-05-14
    • 2015-06-24
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2016-02-15
    • 2016-10-05
    相关资源
    最近更新 更多