依赖项中的Makefile字符串替换无效

依赖项中的Makefile字符串替换无效,makefile,Makefile,我有一个文件夹结构,其中我的所有源文件位于./src/,我的所有目标文件位于./obj/(具有相同的内部目录结构,使用路径替换进行镜像)。我创建了以下生成文件: $(EXECUTABLE): $(OBJECTS) @echo Linking $(EXECUTABLE)... $(CXX) $(LDLIBS) $(OBJECTS) -o $(EXECUTABLE) %.o: $(subst o,cpp,$(subst obj/,src/,$@)) @echo Buildi

我有一个文件夹结构,其中我的所有源文件位于./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
,或
$@
吗?

您不能在必备项中使用
$@
,只能在命令中使用

但你可以这样做:

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

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

但你可以这样做:

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

@echo Building$@from$非常有用的示例。非常有用的示例。