现有文件和正确路径出现“无法打开源文件”错误

Posted

技术标签:

【中文标题】现有文件和正确路径出现“无法打开源文件”错误【英文标题】:"Cannot open source file" error with existing file and correct path 【发布时间】:2018-05-09 18:58:58 【问题描述】:

我正在构建一些自定义 Qt 组件作为静态库,但我无法通过编译阶段。 我的项目结构如下:

Root:
 - .h and . cpp files of the custom Qt components
 - GeneratedFiles/Debug/ <-- here the MOC compiler puts the generated moc_*.cpp files ("Debug" is automatically deducted from the build configuration, so it's Release for release builds)

这是一个非常标准的文件夹设置,但无论出于何种原因,编译器都找不到只有 moc 文件。根文件夹中的任何内容都可以正常构建,但找不到 moc 文件。请注意,moc_ 文件生成得很好,并且存在于它们应该存在的位置,并且内容正确。问题似乎出在GeneratedFiles\Debug\moc_whatever.cpp路径的评估上。

有趣的是,如果我在根文件夹中移动一个 moc 文件(例如,moc_example.cpp)并手动调整对CL.exe 的调用以编译moc_example.cpp 而不是GeneratedFiles\Debug\moc_example.cpp,则该文件将被构建。

我使用的是 VS 2017 版本 15.7.1,CL 是用于 x64 的版本 19.00.24215.1,我会用任何其他可能有用的细节更新问题,只需在评论中添加询问即可。

那么...为什么编译器告诉我这些文件不存在?

【问题讨论】:

我发现 Qt VS 插件的问题与 moc'ing 过程有关,通常与其中一些意外从项目中排除有关。我不得不手动修复它们(在项目文件中)。您可以查看 .vcxproj 文件以检查那里的路径是否正确,可能是未定义的 envvar? 问题与vcproj文件无关。尝试使用直接cl.exe 调用通过命令行构建会引发相同的错误。此外,从构建的源中排除moc_*.cpp 文件并在相对*.cpp 的末尾强制#include-ing(并添加所有必要的包含目录)也会导致同样的问题。同样,如果我将文件移动到根目录,一切都会编译。到目前为止,我最好的猜测是“黑魔法在起作用”。 【参考方案1】:

我终于解决了这个在新目录中重建目录结构的问题。显然,使用 WSL 的 git 在 Windows 下检查存储库会破坏文件系统中的某些内容,这种方式在资源管理器或 Ubuntu 的命令行中是不可见的,但这会破坏编译器(以及 Visual Studio 的智能感知)。

使用适用于 Windows 的 Git 检查存储库似乎可以避免导致同样的问题。

【讨论】:

以上是关于现有文件和正确路径出现“无法打开源文件”错误的主要内容,如果未能解决你的问题,请参考以下文章

vs无法打开源文件,比如#include <cstdio.h>。 包含目录添加路径也试过了。还是不行,

VS2013无法打开源文件iostream、stdlib等。

c++源文件无法运行的原因是无法打开源文件?

Visual Studio 2012 错误:无法打开源文件

我无法打开源文件 clang64.exe 和 crtdbg.h 错误?

VC++ 错误:错误 C1083:无法打开源文件:'=0x0401':没有这样的文件或目录