错误 C1083

无法打开 filetype 文件:“file”:消息

编译器在找不到文件时会生成 C1083 错误。 此错误有许多可能的原因。 最常见的原因包括:包含搜索路径错误,或者头文件丢失或命名错误,但其他文件类型和问题也可能导致 C1083。 下面是编译器生成此错误的常见原因。

指定的文件名错误

文件名可能键入有误。 例如,

#include <algorithm.h>

可能找不到你想要的文件。 大多数 C++ 标准库头文件都没有 .h 文件扩展名。 此 #include 指令找不到 <algorithm> 标头。 要解决此问题,请验证输入的文件名是否正确,如下所示:

#include <algorithm>

某些 C 运行库标头位于标准包含目录的子目录中。 例如,若要包含 sys/types.h,则必须在 #include 指令中包含 sys 子目录名称:

#include <sys/types.h>

文件未包含在 include 搜索路径中

此编译器无法使用 #include#import 指令的搜索规则查找该文件。 例如,如果头文件名用引号括起来,

#include "myincludefile.h"

这指示编译器首先应在包含源文件的同一目录中查找该文件,然后在生成环境指定的其他位置查找。 如果引号包含绝对路径,则编译器仅在该位置查找文件。 如果引号包含相对路径,则编译器在相对于源目录的目录中查找文件。

如果名称使用尖括号括起来,

#include <stdio.h>

编译器遵循由生成环境、/I 编译器选项、/X 编译器选项和 INCLUDE 环境变量定义的搜索路径。 有关详细信息(包括有关用于查找文件的搜索顺序的特定详细信息),请参阅 #include 指令 (C/C++)#import 指令

如果包含文件位于相对于源目录的另一个目录中,并且你在 include 指令中使用相对路径,则必须使用双引号而不是尖括号。 例如,如果头文件 myheader.h 位于名为标头的项目源的子目录中,则此示例找不到该文件并导致 C1083:

#include <headers\myheader.h>

但此示例有效:

#include "headers\myheader.h"

相对路径也可以与包含搜索路径上的目录一起使用。 如果将目录添加到 INCLUDE 环境变量或 Visual Studio 中的“包含目录”路径,请不要将该路径的一部分添加到 include 指令中。 例如,如果标头位于 \path\example\headers\myheader.h,并将 \path\example\headers\ 添加到 Visual Studio 中的“包含目录”路径,但 #include 指令引用了该文件

#include <headers\myheader.h>

则找不到该文件。 使用相对于包含搜索路径中指定的目录的正确路径。 在此示例中,可以将包含搜索路径更改为 \path\example\ 或从 #include 指令中删除 headers\ 路径段。

第三方库问题和 vcpkg

如果在尝试将第三方库配置为生成的一部分时看到此错误,请考虑使用 vcpkg(C++ 包管理器)来安装和生成该库。 vcpkg 支持一个庞大且不断增长的第三方库列表,并将成功生成所需的所有配置属性和依赖项设置为项目的一部分。

该文件在项目中,但不在包含搜索路径中

即使头文件作为项目的一部分在解决方案资源管理器中列出,也只有在文件由 #include#import 指令引用,并且位于 include 搜索路径中时,编译器才能找到这些文件。 不同种类的生成可能会使用不同搜索路径。 /X 编译器选项可用于从包含搜索路径中排除目录。 这样不同的生成就可以使用具有相同名称、但保存在不同目录中的不同包含文件。 这是使用预处理器命令进行的条件编译的替代方法。 有关 /X 编译器选项的详细信息,请参阅 /X(忽略标准包含路径)

若要修复此问题,请更改编译器用于搜索包含或导入的文件的路径。 新项目使用默认包含搜索路径。 可能必须修改 include 搜索路径才能为项目添加目录。 如果在命令行上进行编译,请将路径添加到 INCLUDE 环境变量或 /I 编译器选项,以指定文件的路径。

若要在 Visual Studio 中设置包含目录路径,请打开项目的“属性页”对话框。 在左窗格的“配置属性”下选择“VC++ 目录”,然后编辑“包含目录”属性。 有关由 Visual Studio 中的编译器搜索的每个用户和每个项目的目录的详细信息,请参阅 VC++ 目录属性页。 有关 /I 编译器选项的详细信息,请参阅 /I(其他包含目录)

未设置命令行 INCLUDE 或 LIB 环境

在命令行中调用编译器时,通常会使用环境变量来指定搜索路径。 如果 INCLUDE 或 LIB 环境变量描述的搜索路径设置错误,会生成 C1083 错误。 强烈建议使用开发人员命令提示符快捷方式来设置命令行生成的基本环境。 有关详细信息,请参阅在命令行上生成 C/C++ 代码。 有关如何使用环境变量的详细信息,请参阅如何:在生成中使用环境变量

该文件可能已被锁定或正在使用中

如果正在使用其他程序来编辑或访问该文件,则该文件可能已被锁定。 请尝试在其他程序中关闭该文件。 如果使用并行编译选项,有时其他程序可以是 Visual Studio 本身。 如果关闭并行生成选项会使错误消失,那么这就是问题所在。 其他并行生成系统也可能存在此问题。 请注意设置文件和项目依赖项,以确保生成顺序是正确的。 在某些情况下,请考虑创建中间项目来强制执行可能由多个项目生成的通用文件的生成依赖项顺序。 有时防病毒程序会暂时锁定最近更改的文件以进行扫描。 如果可能,请考虑从防病毒扫描程序中排除项目生成目录。

包含了错误版本的文件名

C1083 错误还可能指示包含了错误版本的文件。 例如,某个生成可能包含错误版本的文件,该文件的 #include 指令针对不是用于该生成的头文件。 例如,某些文件可能仅适用于 x86 版本或调试版本。 当找不到头文件时,编译器会生成 C1083 错误。 此问题的解决方法是使用正确的文件,而不是向生成添加头文件或目录。

预编译标头尚未预编译

当项目配置为使用预编译标头时,必须创建相关 .pch 文件,以便可以编译使用头内容的文件。 例如,对于新项目,pch.cpp 文件(Visual Studio 2017 及更早版本中的 stdafx.cpp 文件)会自动在项目目录中创建。 先编译该文件以创建预编译的头文件。 在典型的生成过程设计中,这是自动完成的。 有关详细信息,请参阅创建预编译标头文件

其他原因

  • 你已经安装 SDK 或第三方库,但尚未打开新的开发人员命令提示符。 如果 SDK 或库将文件添加到 INCLUDE 路径,可能需要打开新的开发人员命令提示符窗口才能获取这些环境变量更改。

  • 文件使用托管代码,但是未指定编译器选项 /clr。 有关详细信息,请参阅 /clr(公共语言运行时编译)

  • 将使用不同于预编译标头时使用的 /analyze 编译器选项设置对文件进行编译。 预编译项目的标头时,全都应使用相同的 /analyze 设置。 有关详细信息,请参阅 /analyze(Code Analysis)

  • 文件或目录由适用于 Linux 的 Windows 子系统创建,启用了每目录大小写敏感度,并且指定的路径或文件的大小写与磁盘上的路径或文件的大小写不匹配。

  • 文件、目录或磁盘为只读。

  • Visual Studio 或命令行工具没有足够的权限读取文件或目录。 例如,当项目文件拥有与运行 Visual Studio 或命令行工具的进程不同的所有权时,就会发生这种情况。 有时可以通过以管理员身份运行 Visual Studio 或开发人员命令提示符来修复此问题。

  • 没有足够多的文件句柄。 关闭一些应用程序,然后重新编译。 这种情况一般不常见。 但是,在物理内存有限的计算机上生成大型项目时,可能会发生这种情况。

示例

如果源目录或 include 搜索路径中没有头文件 "test.h",以下示例会生成 C1083 错误。

// C1083.cpp
// compile with: /c
#include "test.h"   // C1083 test.h doesn't exist
#include "stdio.h"  // OK

有关如何在 IDE 或命令行中生成 C/C++ 项目的信息,以及有关设置环境变量的信息,请参阅项目和生成系统

另请参阅