2012-12-07 32 views
1

我有一个文件夹结构,其中我的所有源文件都在./src/中,并且我的所有对象文件都在./obj/中(具有相同的内部目录结构,使用路径替换镜像)。我创建了以下makefile:Makefile文件字符串替换依赖不起作用

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

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

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

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

对于每一个源文件,它完美的作品。我检查了两个subst给出了相同的结果(obj/main.o成为src/main.cpp,如预期的那样)。但由于某种原因,Make不接受依赖关系。

这给了我很多的悲伤,有人可以解释我要去哪里吗?我不明白发生了什么事情,我认为我的替代将同样工作,因为它提供了相同的输出。我不允许在依赖关系中使用subst[email protected]什么?

回答