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++ 包找不到从包中的其他头文件调用的头位置的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何处理包中的头文件?

Code::Blocks 中的头文件和源文件问题

C++中的cmath头文件

git:找不到 blob - 想从包中删除它

找不到opencv相关的头文件stitcher.hpp

C++ 中的头文件和命名空间