除了"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它找到并替换了实用程序的路径,但显然没有用于设置。它们位于同一个文件夹中,它们的命令都是相同的。老实说,我一点也不知道出了什么问题,这几乎毁了我的计划。
你们对这件事有什么明智的看法吗?
我是在这里偶然发现了什么真正的东西,还是我只是一个没有读完家庭作业的笨蛋?
发布于 2015-11-06 13:32:54
有一个规则 ( ( Etan Reisner)提供的链接,VPATH和vpath只用于先决条件,而不是目标)。
在您的示例中,只要将VPATH文件作为目标和先决条件,.cpp就会“不可预知”地运行。好消息是,您的第一个版本中没有冗余。如果更新了.o和.hpp之一,您确实希望重新生成.hpp。事实上,你不想要
Utilities.cpp: Utilities.hpp因为如果您更新了没有配方的.cpp,这将尝试重新构建.hpp。
因此,我将坚持您的第一个版本,而不是考虑使用vpath以便于维护。
vpath %.cpp ./src/
vpath %.hpp ./include/https://stackoverflow.com/questions/33567135
复制相似问题