C++ 包找不到从包中的其他头文件调用的头位置
Posted
技术标签:
【中文标题】C++ 包找不到从包中的其他头文件调用的头位置【英文标题】:C++ package cannot find header locations called from other header files in package 【发布时间】:2018-03-11 22:46:48 【问题描述】:在我开始之前,请多多包涵,我是 cpp 新手,没有接受过正规培训,这个问题可能已经被问过和回答过,但我不知道该怎么称呼任何东西。
所以我有一个 cpp 程序,我想在其中使用这个开源 google sling 包。我的 google sling 包与我的 main.cpp 程序位于同一目录中,我可以包含一个带有相对于路径的标题程序,但该标头(A)调用包中的其他标头(B:),并且这些标头(B:)的相对路径与该标头(A)文件无关。这是错误堆栈:
name@name-ThinkCentre-M83:~/Desktop/c++coding_projects/test_project$ g++ -Isling main.cpp
In file included from main.cpp:7:0:
sling/frame/object.h:25:10: fatal error: sling/base/logging.h: No such file or directory
#include "sling/base/logging.h"
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
name@name-ThinkCentre-M83:~/Desktop/c++coding_projects/test_project$ ls
bin obj test_project.cbp test_project.layout
main.cpp sling test_project.depend text_testfiles
name@name-ThinkCentre-M83:~/Desktop/c++coding_projects/test_project$ vim main.cpp
name@name-ThinkCentre-M83:~/Desktop/c++coding_projects/test_project$ cd sling/base
name@name-ThinkCentre-M83:~/Desktop/c++coding_projects/test_project/sling/base$ ls
bitcast.h flags.cc libinit.cc port.h status.cc types.h
BUILD flags.h logging.cc registry.cc status.h
clock.cc init.cc logging.h registry.h strtoint.cc
clock.h init.h macros.h slice.h strtoint.h
所以sling/base/logging.h
确实存在,但由于它是从sling/frame/object.h
调用的,因此正确的相对路径将是../base/logging.h
(至少我有限的知识告诉我如此)。我想我必须设置它,使它成为我的 cpp 编译器搜索依赖项的全局路径的一部分。不管怎样,我都做错了。
我正在寻找一个半快速的解决方案,但我也想在将来避免这种情况,因此也非常感谢提供指向相应信息的链接。
编辑:
也尝试过同样的错误:
g++ -I.sling main.cpp
g++ -Itest_project main.cpp
g++ -isystem sling main.cpp
g++ -iwithprefixbefore "/home/.../test_project/" main.cpp
其中 ... 是从家到我的测试项目的路径
【问题讨论】:
***.com/questions/15478005 谢谢你们,正如你们所看到的,我首先使用了g++ -Isling main.cpp
,我刚刚尝试了g++ -isystem sling main.cpp
并收到了同样的错误,但还有很多需要从那个来源阅读,所以我会及时通知你
不应该是-I.
吗?
如g++ -I.sling main.cpp
?
不,如g++ -I. main.cpp
(或可能g++ -Isling -I. main.cpp
)。
【参考方案1】:
谢谢 melpomene,正确答案是g++ -I. main.cpp
。结案。
感谢 cmets 中的 Jerry Jeremiah 提供此信息:
#include <x>
表示“包含包含路径中的文件”,#include "x"
表示“包含当前目录中的文件”
因此,我的程序从目录“sling/frame/”(最初称为“sling/frame/object.h”的位置)中调用头文件“sling/base/logger.h”,并为明显的原因在那里找不到。
【讨论】:
您知道为什么需要-I
吗?之所以需要它,是因为 sling 头文件使用 #include <x>
而不是 #include "x"
来包含其他文件。 #include <x>
表示“包含包含路径中的文件”(使用 -I 定义),#include "x"
表示“包含当前目录中的文件”
我不知道,但我认为您可能想要编辑它。我在#include "x"
的错误中看到了吊索文件,也许我找错了地方。根据您的回答,从目录“sling/frame/”中找不到“sling/base/logging.h”是有道理的,但-I.
必须指定在哪里查找#include 的任何一种情况。尽管如此,感谢您提供的信息。以上是关于C++ 包找不到从包中的其他头文件调用的头位置的主要内容,如果未能解决你的问题,请参考以下文章