【问题标题】:#include not finding files while the Visual Studio autocomplete suggestions can find the files#include 找不到文件,而 Visual Studio 自动完成建议可以找到文件
【发布时间】:2021-03-25 20:32:02
【问题描述】:

我正在尝试包含 Glad(使用 GL3.3 api 从here 生成(GLFW 也有类似的包含问题)))

#include <glad/glad.h>

我觉得这应该可以工作,因为我在项目中为文件添加了额外的包含目录

vendor\Glad\include

我的 VS 解决方案的文件结构为

-solutionName
--projectName
---src
----projectname.h <- Where I am including from for now, latter I want to include from elsewhere under the src directory.
---vendor (same level as src)
----Glad
-----include
------glad
-------glad.h
------KHR
-------khrplatform.h

我已经能够通过将文件包含为来使包含工作

#include <../vendor/Glad/include/glad/glad.h>

但是当我这样做时,我得到一个错误(“C1083”“无法打开包含文件:'KHR/khrplatform.h':没有这样的文件或目录”),因为glad.h中的包含找不到khrplatform。 h 当它包括这样的时候

#include <KHR/khrplatform.h>

我可以在glad.h 中更改该行,但我真的不想更改库的代码来使我的工作正常。

这也发生在 GLFW 上,它镜像了额外的包含目录和文件路径,但很高兴在适用的情况下替换为 GLFW。

此外,Visual Studio 将提供

<glad/glad.h>

当我在 projectName.h 中输入包含行时建议使用文件路径,但我仍然收到错误“C1083”“无法打开包含文件:'glad/glad.h':没有这样的文件或目录”。

另一个怪癖是我使用 spdlog 文件附加包含目录

vendor\spdlog\include

并且能够在 src 目录中包含标题:

#include <spdlog/spdlog.h>

有效且不会引发问题。

这个文件结构是

-solutionName
--projectName
---src
----Utilities
-----Logger.h <- Where I am including from.
---vendor (same level as src)
----spdlog
-----include
------spdlog
-------spdlog.h <- file I am including just fine.

这让人感觉只有一些额外的包含目录在实际工作,我不确定为什么会发生这种情况,或者在花了几个小时进行猜测和检查后如何修复它。我想包括像

这样的库
#include <glad/glad.h>
#include <GLFW/glfw3.h>

我怎样才能做到这一点?

感谢您的宝贵时间, -迈克尔

【问题讨论】:

  • 在附加的包含目录中使用 absolute 路径。
  • 我已将vendor/Glad/include 替换为D:\VSProjects\solutionName\ProjectName\vendor\Glad\include 应用更改并重新启动VS,但对于glad/glad.h 仍然出现相同的“C1083”错误。
  • 看不出有什么问题,请检查是否有错别字。顺便说一句,我认为将其构建为一个单独的项目会更好。如果文件位于您的项目目录中,请使用 VS 宏 $(ProjectDir) 来表示它,而不是真实路径。
  • 您能否详细说明当您说“我认为将其构建为单独的项目会更好”时的意思。如果您指的是 Glad,那么我想我可能会像 Visual Studio 那样将库构建到一个 .lib 文件中,并将该项目作为我试图包含标头的项目的依赖项。我可能完全偏离了基础并且误解了你的意思!我现在已将宏添加到所有其他包含目录路径中,并且在我再次尝试包含 之前它一直有效。
  • 那么如果是依赖,为什么要放在你的项目目录下呢?它不是您项目的一部分。这是一个单独的项目。

标签: c++ visual-studio-2019 glfw glad


【解决方案1】:

使用"glad/glad.h" 代替&lt;glad/glad.h&gt;

使用尖括号,编译器仅搜索包含的标准路径,使用引号它还搜索您定义的其他包含路径。

【讨论】:

  • 我已经改变了它,所以现在包含 #include "glad/glad.h" 但是得到同样的错误“C1083”,它现在没有红色错误线,所以它看起来像是进步。
  • 不正确,附加搜索路径用于搜索尖括号和引号中的头文件。
  • 好吧,我以前错了... :-)。看来我们需要他完整的附加包含目录列表来进一步分析这个问题。
  • 更新:不要介意红色错误下划线消失,它现在在重新加载 Visual Studio 后又回来了。
  • 这是我的附加包含目录的完整列表:“src”“vendor\spdlog\include”“vendor\GLFW\include”“vendor\Glad\include”
【解决方案2】:

好吧,所以我终于想通了,我对我必须这样做的方式不满意,但我想它有效,所以除非有人有建议,否则我会继续前进。因此,问题归结为我将标题包含在我正在制作的静态库中,然后在其他地方使用了该静态库。 (我没有意识到这是一个问题,否则我会在我原来的问题中提到,对不起大家。)我将我的 lib 包含在一个标题中,其中包含我想要访问的所有依赖项,后来这些依赖项第 3 方静态库将越来越抽象,但目前我要做的就是告诉我的其他“沙盒”(非库)项目也有额外的包含目录,如

$(SolutionDir)MyLibName\vendor\Glad\include

$(SolutionDir)MyLibName\vendor\GLFW\include

理想情况下,我不想包含除 MyLib 之外的任何内容,但我想这是我目前的工作。感谢所有提供建议的人!

【讨论】:

  • 好吧,即使你把所有这些包含文件都隐藏在另一个包含文件中,至少编译器必须知道你所有的包含文件在哪里,否则编译器怎么能找到它们呢?
  • 如果我必须添加包含目录的地方不是与我 #including 他们所在的项目不同的项目,那对我来说很有意义。据我所知,它们应该只被编译进入静态库,我将它们链接到不是我正在测试库的驱动程序。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 2021-06-05
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多