VPATH目标失败

时间:2015-11-06 12:46:21

标签: makefile gnu-make

我不知道除了" VPATH失败"之外怎么表达这个小问题,并且搜索那个让我无处可去,所以现在我放手一搏,把我的问题投入游泳池。

我在这里处理一个简单的makefile而且遇到了一个问题,我完全被这个问题困住了。 我做了第一个原版,我工作得很好,花花公子:

// Variable pre-processing stuff up here
VPATH =  ./src/ ./include/ 

// Usual phony targets in here

$(OBJF)Utilities$(R).o: Utilities.cpp Utilities.hpp
    @echo Building $@
    @echo $<
    @$(CXX) $(FLAGS) -Iinclude -c $< -o $@

$(OBJF)Settings$(R).o: Settings.cpp Settings.hpp
    @echo Building $@
    @echo $<
    @$(CXX) $(FLAGS) -Iinclude -c $< -o $@

// More file targets down here

由make输出证明

lex@Lex-Laptop:~/Dev/LHArch$ make RELEASE=STATIC rebuild
Removing object files and outputs...
Cleaning done.
Building objs/Release/Static/Utilities.o
./src/Utilities.cpp
Building objs/Release/Static/Settings.o
./src/Settings.cpp

那太好了 为了删除依赖项的冗余,我认为以这种方式将代码放入自己的目标是个好主意:

$(OBJF)Utilities$(R).o: Utilities.cpp
    @echo Building $@
    @echo $<
    @$(CXX) $(FLAGS) -Iinclude -c $< -o $@

Utilities.cpp: Utilities.hpp

$(OBJF)Settings$(R).o: Settings.cpp
    @echo Building $@
    @echo $<
    @$(CXX) $(FLAGS) -Iinclude -c $< -o $@

Settings.cpp: Settings.hpp

这就是我改变的一切。我希望它能像以前一样完美地工作,但它只是部分地做了:

lex@Lex-Laptop:~/Dev/LHArch$ make RELEASE=STATIC rebuild
Removing object files and outputs...
Cleaning done.
Building objs/Release/Static/Utilities.o
./src/Utilities.cpp
Building objs/Release/Static/Settings.o
Settings.cpp
g++: error: Settings.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
Makefile:101: recipe for target 'objs/Release/Static/Settings.o' failed
make: *** [objs/Release/Static/Settings.o] Error 1

它找到并取代了Utilities的路径,但显然没有取代Settings。它们位于同一文件夹中,两者的命令相同。老实说,我不知道出了什么问题,这有点毁了我的计划。

你们有任何明智的话吗? 我偶然发现了一些真实的东西,还是我只是一个没有读过他的家庭作业的笨蛋?

1 个答案:

答案 0 :(得分:0)

这是ruleEtan Reisner) 提供的链接VPATHvpath只应用于先决条件,而不是目标。

在您的情况下,只要将VPATH文件作为目标和先决条件,.cpp就会“无法预测”。好消息是你的第一个版本没有冗余。如果.o.cpp中的任何一个更新,您确实需要重建.hpp。事实上,你想要

Utilities.cpp: Utilities.hpp

因为如果您更新.cpp,这将尝试重建.hpp,而没有配方。

因此,我会坚持使用您的第一个版本,而是考虑使用vpath以便于维护

vpath %.cpp ./src/
vpath %.hpp ./include/