【问题标题】:Visual Studio cannot open include file, drops characters from pathVisual Studio 无法打开包含文件,从路径中删除字符
【发布时间】:2020-03-16 04:04:41
【问题描述】:

我正在使用 Microsoft Visual Studio Professional 2017 构建一个使用 Poco 库的项目。

背景:

不知道这是否相关,但我只想提一下,我手动下载并构建了 Poco(以及所需的所有其他库),多年来一切都很好。现在我改用 Miniconda3 来管理我的库,通过 conda install -c conda-forge poco 安装 Poco 并从

更改相关的包含路径
$(POCO_DIR)/Foundation/include
$(POCO_DIR)/Util/include
...

只是

$(CONDA_LIBS)/include

使用系统变量$(CONDA_LIBS) = D:\CodeLibraries\conda_libs\Library。这个CONDA_LIBS 目录存在并包含一个include/Poco/ 子目录,其中包含所有Poco 头文件和子目录。

问题:

项目编译良好。我遇到了链接器错误,在深入研究时我发现了 Visual Studio 2017 的一些奇怪行为:

当我使用任何 Poco 头文件将光标移动到 #include 指令时,例如

#include "Poco/DateTime.h"

我可以通常键入 CTRL+SHIFT+G 打开并跳转到相关文件。
这行不通了,我收到一个弹出窗口告诉我

D:\CodeLibraries\conda_libs\Library\include\oco\atetime.h
无法打开文件。

注意\(P)oco\(D)atetime.h 中缺少的字母。另请注意,文件已找到,但无法打开

当我尝试使用子目录中的头文件时,例如

#include "Poco/JSON/Parser.h"

我收到消息

D:\CodeLibraries\conda_libs\Library\include\oco\son\rser.h
无法打开文件。

注意(P)oco\(J)SON\(Pa)rser.h 中缺少的字母“P”、“J”和“Pa”(?!)。

附加信息:

  • 当我将 Poco 头文件从 Windows 资源管理器拖放到 Visual Studio (!) 时,弹出相同的错误
  • 我可以从打开文件对话框打开这些文件(CTRL+O
  • 我仍然可以使用 CTRL+SHIFT+G 快捷方式在我的项目中打开我自己的头文件,并打开其他库像 gdal.h 或 boost 头文件这样的头文件
  • 如果我#include "oco/ateTime.h"(注意缺少的字母)并尝试通过 CTRL+SHIFT+G 打开它,我得到了预期消息“在当前源文件的目录或构建系统路径中找不到文件'oco/ateTime.h'”,下面列出的路径包括D:\CodeLibraries\conda_libs\Library/include

问题:

知道为什么 Poco 头文件的 CTRL+SHIFT+G 快捷方式和拖放操作都失败了吗?


编辑:
请注意:

  • 我不是在询问一般的“找不到文件”错误:我通常可以很好地处理我的包含和库路径,谢谢
  • 至少在过去几年中,斜杠和反斜杠在 Visual Studio 中几乎可以互换使用

【问题讨论】:

  • 您确定没有第 3 方扩展程序会破坏您的 Visual Studio 设置吗?你也试过\,而不是/?
  • “项目编译正常。我收到链接器错误”,你能用链接器错误更新帖子吗?
  • 当您混合不同版本的库(dll、lib 或目标文件)和/或其相应的头文件时,会发生链接器错误。这种情况通常发生在您只引用最新的头文件而不是最新的库时,反之亦然。请确保您链接到您在包含路径中配置的 POCO 的确切版本。如果可能,请使用以前使用的 POCO 版本和您当前通过 conda 配置的 POCO 检查并更新线程。还要检查你的 Visual Studio 项目中是否正确配置了包含和库路径。
  • anaconda.org/conda-forge/poco中提到的POCO的当前版本是1.9.0。
  • 还有一件事,你没有提到你是否在你的项目中重新配置了链接器路径。您只提到了包含路径中的更改。

标签: visual-studio visual-c++ visual-studio-2017 poco-libraries


【解决方案1】:

“无法打开文件” 错误可能是由于您的项目包含和源路径中的配置错误,或者由于第三方扩展,甚至可能是由于 IDE 损坏/错误,但它正如您也提到的,与链接器错误无关。您还确认文件正在被编译,所以这肯定是 IDE 的内置代码导航器或扩展的问题。

关于链接器错误,在链接第三方库时,您所指的项目配置、库目标、库和头文件版本应该匹配。

这些是链接第三方库的一些通用清单:

  1. 运行时库:MT、MTd、MD、MDd 等
  2. 字符集:Unicode 或多字节
  3. 目标编译器
  4. 目标机
  5. 子系统
  6. 正在使用的第三方库是否具有其他依赖项,并且您正确链接了它们的确切版本。

这些是特定于 POCO 的清单:

  1. 您在头文件与链接器路径中引用的 POCO 版本 配置。

  2. 您要链接项目的 OpenSSL 版本,如果您是 使用 POCO 的 SSL、Crypto 和 NET 模块。

我机器上的相同设置(但为 VisualStudio 2017 目标配置了 VisualStudio 2019)工作正常。

【讨论】:

  • 这个答案没有提供关于为什么在构建项目时找到 Poco 头文件的任何建议,而不是在编辑时由 IntelliSense 提供的建议。
  • @ChristianSeverin,“所以这肯定是 IDE 的内置代码导航器或扩展的一些问题”在这句话中我只是指您正在谈论的相同 IntelliSense 问题,我已经提到它作为为了简单和易于理解,代码导航器而不是 Intellisense。每当更改依赖路径并且 Intellisense 无法更新其数据库时,即使对我来说,这种情况也经常发生。我不确定我们是否可以选择强制重置 Intellisense DB。我通常会删除 Intellisense 文件并重新启动 IDE。
  • Waitwaitwait:你说“即使对我来说也经常发生这种情况”——你的意思是你也看到了这种行为,你不能从#include跳出来到头文件的行,然后弹出一条错误消息,路径异常混乱?
  • @ChristianSeverin,是的,这通常发生在重新配置依赖路径时(即:当第三方文件移动到不同位置时),即使依赖文件没有发生变化,除了为路径改变。我猜 Intellisense 无法检测到这一点。我从来没有费心向微软报告这个问题。我通常删除 Intellisense 数据库并重新启动强制重新初始化 Intellisense DB 的 IDE。
  • 嗯。好的,那么对不起,我误解了你的答案。您可能想要编辑它以强调您确实也遇到了这个问题,以及您为解决它所做的工作。我建议删除对链接器错误的引用,当你在它的时候......我会接受你的答案并在我的参考你的答案。
【解决方案2】:

在 Windows 中,您应该使用“\”作为目录分隔符,而不是“/”。

我的猜测是VS将你的“/”替换为“\”,那么每个单词的第一个字母都是非转义字符。

尝试将“/”替换为“\\”。

【讨论】:

  • 我在几乎所有项目中都混合使用“/”以及未转义的“\”和转义的“\\”斜杠。我从来没有遇到过这些问题。 IMO,Visual Studio 永远不会用转义字符替换斜杠。不过,这可能是由于某些第三方扩展而发生的。
  • 这几天VS用'/'作为分隔符已经没有问题了;过去的几个版本都没有,IIRC。
【解决方案3】:

奇数。

当我今天回到办公室时,我想再次查看这个问题,看看我是否能找到更多关于 IntelliSense 没有找到 POCO 标头以及错误消息中奇怪的丢弃字符的信息,但它现在可以工作了:
是的,我可以通过将光标移动到 #include 行并点击 CTRL+SHIFT+G 再次跳转到 POCO 头文件.

不知道是重新启动 VS 修复了这个问题,还是修复了链接器错误 - 这是微不足道的,顺便说一句,我什至可能在写这个问题时已经做了。不幸的是,我要么在链接器修复后没有重新检查 IntelliSense 的损坏行为,要么没有费心记录 IntelliSense 之后仍然损坏。
所以:恐怕没有真正的关闭。


编辑:Ramesh Kambadaasan's answer 建议解决方法可能是删除 IntelliSense DB 文件并重新启动 VS 以强制重新解析项目。下次我试试。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2015-05-10
    • 2013-10-25
    • 2013-04-30
    • 1970-01-01
    • 2022-07-02
    相关资源
    最近更新 更多