依赖的Makefile字符串替换不起作用

Tho*_*mas 1 makefile

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

$(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 $@
Run Code Online (Sandbox Code Playgroud)

哪个不行!Make一直声称目标文件是最新的,即使源文件实际上比目标文件旧.另一方面,如果我这样做:

obj/main.o: src/main.cpp
    @echo Building $@...
    $(CXX) $(CPPFLAGS) -c src/main.cpp -o $@
Run Code Online (Sandbox Code Playgroud)

对于每个源文件,它都可以完美运行.我检查了,两个subst给出了相同的结果(obj/main.o成为src/main.cpp,如预期的那样).然而,由于某种原因,Make不接受依赖.

这给了我很多的悲伤,有人可以解释我哪里出错了吗?我不明白发生了什么,我认为我的替换会起作用,因为它给出了相同的输出.我不被允许使用subst,或者$@依赖于什么?

Bet*_*eta 6

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

但你可以这样做:

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