首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VPATH目标失效

VPATH目标失效
EN

Stack Overflow用户
提问于 2015-11-06 12:46:21
回答 1查看 159关注 0票数 1

除了"VPATH失败“之外,我不知道如何表达这个小问题,而寻找它却没有给我带来任何帮助,所以现在我尝试一下,把我的问题扔进池中。

我在这里做一个简单的makefile,我遇到了一个问题,我完全被这个问题所困扰。我做了第一个原版,我做得很好,很棒:

代码语言:javascript
复制
// 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输出所证明的那样

代码语言:javascript
复制
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

那很好。

为了消除依赖项的一些冗余,我认为以这种方式将代码放入它们自己的目标中是个好主意:

代码语言:javascript
复制
$(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

这就是我所改变的一切。我原以为它能像以前一样完美地工作,但它只是部分地起了作用:

代码语言:javascript
复制
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

它找到并替换了实用程序的路径,但显然没有用于设置。它们位于同一个文件夹中,它们的命令都是相同的。老实说,我一点也不知道出了什么问题,这几乎毁了我的计划。

你们对这件事有什么明智的看法吗?

我是在这里偶然发现了什么真正的东西,还是我只是一个没有读完家庭作业的笨蛋?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 13:32:54

有一个规则 ( ( Etan Reisner)提供的链接,VPATHvpath只用于先决条件,而不是目标)。

在您的示例中,只要将VPATH文件作为目标和先决条件,.cpp就会“不可预知”地运行。好消息是,您的第一个版本中没有冗余。如果更新了.o.hpp之一,您确实希望重新生成.hpp。事实上,你想要

代码语言:javascript
复制
Utilities.cpp: Utilities.hpp

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

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

代码语言:javascript
复制
vpath %.cpp ./src/
vpath %.hpp ./include/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33567135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档