我不知道除了" 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。它们位于同一文件夹中,两者的命令相同。老实说,我不知道出了什么问题,这有点毁了我的计划。
你们有任何明智的话吗? 我偶然发现了一些真实的东西,还是我只是一个没有读过他的家庭作业的笨蛋?
答案 0 :(得分:0)
这是rule(Etan Reisner) 提供的链接VPATH
和vpath
只应用于先决条件,而不是目标。
在您的情况下,只要将VPATH
文件作为目标和先决条件,.cpp
就会“无法预测”。好消息是你的第一个版本没有冗余。如果.o
和.cpp
中的任何一个更新,您确实需要重建.hpp
。事实上,你不想要
Utilities.cpp: Utilities.hpp
因为如果您更新.cpp
,这将尝试重建.hpp
,而没有配方。
因此,我会坚持使用您的第一个版本,而是考虑使用vpath
以便于维护
vpath %.cpp ./src/
vpath %.hpp ./include/