当链接器无法打开文件(用于读取或写入)时,将报告此错误。 问题的两个最常见原因是:
- 程序已在运行或已加载到调试器中,并且
- 库路径不正确,或未用双引号包装。
此错误还有其他许多可能的原因。 若要缩小文件范围,请先检查文件 文件名 的类型。 然后,使用以下部分来帮助识别和修复特定问题。
无法打开应用或其 .pdb 文件
应用正在运行,或在调试器中加载它
当文件名是可执行文件的名称或关联的 .pdb 文件时,查看应用程序是否已运行。 然后检查它是否在调试器中加载。 若要解决此问题,请停止程序并将其从调试器卸载,然后再重新生成它。 如果应用在另一个程序(如资源编辑器)中打开,请将其关闭。 如果程序无响应,可能需要使用任务管理器结束该过程。 可能还需要关闭并重启Visual Studio。
你的应用被防病毒扫描锁定
防病毒程序通常暂时阻止访问新创建的文件,尤其是.exe和.dll可执行文件。 若要解决此问题,请尝试从防病毒扫描程序中排除项目生成目录。
无法打开 Microsoft 库文件
Windows库,例如 kernel32.lib
如果无法打开的文件是 Microsoft 提供的标准库文件之一,例如 kernel32.lib,则可能有项目配置错误或安装错误。 验证是否已安装Windows SDK。 如果项目需要其他 Microsoft 库(如 MFC),请确保Visual Studio安装程序也安装了 MFC 组件。 可以再次运行安装程序,随时添加可选组件。 有关详细信息,请参阅修改 Visual Studio。 使用安装程序中的 “单个组件 ”选项卡选择特定的库和 SDK。
版本控制 vcruntime 库
如果错误消息有版本控制 Microsoft 库(如 msvcr120.lib),则可能不会安装该编译器版本的平台工具集。 若要解决此问题,有两个选项:升级项目以使用当前平台工具集,或安装较旧的工具集并生成项目不变。 有关详细信息,请参阅从早期版本的 Visual C++ 升级项目并使用Visual Studio中的本机多目标来生成旧项目。
零售、调试或特定于平台的库
首次生成新的目标平台或配置(如零售版或 ARM64)时,可能会出现此错误。 在 IDE 中,验证已安装“常规”属性页中指定的平台工具集和Windows SDK 版本。 此外,请验证所需的库在 VC++ Directory 属性页中指定的库目录中可用。 检查每个配置的属性,例如调试、零售、x86 或 ARM64。 如果一个生成有效,但另一个版本不起作用,请比较两者的设置。 安装任何缺少的所需工具和库。
vccorlib.lib 库
没有适用于通用Windows (UWP) 应用或组件的 Spectre 缓解库。 如果错误消息包含 vccorlib.lib,则可能已在 UWP 项目中启用了 /Qspectre 。 禁用 /Qspectre 编译器选项来解决此问题。 在Visual Studio中,更改 Spectre 缓解属性。 它位于项目 “属性页”对话框的 C/C++ >代码生成页中。
来自联机或其他源的项目中的库
如果生成从另一台计算机复制的项目,库安装位置可能有所不同。 对于命令行生成,请验证是否为生成正确设置了 LIB 环境变量和库路径。 在Visual Studio中,可以查看和编辑项目的属性页中设置的当前库路径。 在 “VC++目录”页中,选择“库目录”属性的下拉列表控件,然后选择“编辑”。 “库目录”对话框的 “评估值”部分列出了搜索库文件的当前路径。 更新这些路径以指向本地库。
更新了 Windows SDK 库
当 Windows SDK 的Visual Studio路径过期时,可能会出现此错误。 如果独立于Visual Studio安装程序安装较新的 Windows SDK,则可能会发生此情况。 若要在 IDE 中修复它,请更新 VC++ Directory 属性页中指定的路径。 设置路径中的版本以匹配新 SDK。 如果使用开发人员命令提示符,请使用新的 SDK 路径更新初始化环境变量的批处理文件。 使用 Visual Studio 安装程序安装更新的 SDK 可以避免此问题。
无法打开第三方库文件
此问题有几个常见原因:
- 库文件的路径可能不正确,或者未用双引号包装。 或者,你可能尚未将它指定给链接器。
- 你可能已安装 32 位版本的库,但要构建 64 位或另一种方式。
- 该库可能依赖于未安装的其他库。
若要修复命令行生成的路径问题,请验证是否已设置 LIB 环境变量。 请确保它包含你使用的所有库的路径,以及生成的每个配置的路径。 在 IDE 中,库路径由VC++目录>库目录属性设置。 请确保此处列出了包含所需库的所有目录,以便生成的每个配置。
可能需要提供替代标准库目录的库目录。 在命令行上使用 /LIBPATH 选项。 在 IDE 中,对项目使用 “配置属性>链接器>常规”属性页中的 “其他库目录”属性。
请确保安装生成配置所需的每个库版本。 请考虑使用 vcpkg 包管理实用工具自动安装并设置许多常见库。 如果可以,最好构建自己的第三方库副本。 然后,请务必生成所有库的本地依赖项,这些依赖项是针对项目相同的配置生成的。
无法打开项目生成的文件
如果链接器尝试访问 它时文件名 尚不存在,可能会看到此错误。 当一个项目依赖于解决方案中的另一个项目时,可能会发生这种情况,但项目按错误顺序生成。 若要解决此问题,请确保项目引用在使用该文件的项目中设置。 然后,缺少的文件在需要之前生成。 有关详细信息,请参阅在 Visual Studio C++ 项目中添加引用,以及管理项目中的引用。
无法打开文件“C:\Program.obj”
如果在错误消息中看到文件名 C:\Program.obj ,请用双引号包装库路径。 当以 C:\Program Files 开头的未包装路径传递到链接器时,会发生此错误。 未包装的路径也可能导致类似的错误。 通常,它们会显示驱动器根目录中的意外 .obj 文件。
若要修复命令行生成的问题,请检查 /LIBPATH 选项参数。 另请检查 LIB 环境变量中指定的路径以及命令行中指定的路径。 请确保对包含空格的任何路径使用双引号。
若要在 IDE 中解决此问题,请根据需要向项目的以下属性添加双引号:
- “配置属性>”VC++“目录”属性页上的 “库目录”属性,
- “配置属性>链接器>常规”属性页中的 “其他库目录”属性,
- “配置属性>链接器>输入”属性页中的 “其他依赖项”属性。
其他常见问题
路径或文件名问题
当指向链接器指定的库文件名或路径不正确时,可能会出现此错误。 或者,当路径具有无效的驱动器规范时。 查看命令行或任何 #pragma注释 (库、“library_name”) 指令中的问题。 检查拼写和文件扩展名,并验证文件是否存在于指定位置。
并行生成同步
如果使用并行生成选项,Visual Studio可能已锁定另一个线程上的文件。 若要解决此问题,请验证同一代码对象或库未在多个项目中生成。 使用生成依赖项或项目引用在项目中选取生成的二进制文件。
IDE 中指定的其他依赖项
直接在 “附加依赖项 ”属性中指定单个库时,请使用空格分隔库名称。 请勿使用逗号或分号。 如果使用 “编辑 ”菜单项打开“ 其他依赖项 ”对话框,请使用换行符分隔名称,而不是逗号、分号或空格。 在“ 库目录 ”和“ 其他库目录 ”对话框中指定库路径时,也可以使用换行符。
太长的路径
当 文件名 的路径扩展到超过 260 个字符时,可能会看到此错误。 如果需要,请重新排列目录结构或缩短文件夹和文件名以缩短路径。
太大的文件
此错误可能是因为文件太大。 超过千兆字节大小的库或对象文件可能会导致 32 位链接器出现问题。 此问题的可能解决方法是使用 64 位工具集。 有关如何在命令行上使用 64 位工具集的详细信息,请参阅 如何:在命令行上启用 64 位 Visual C++ 工具集。 有关如何在 IDE 中使用 64 位工具集的信息,请参阅将MSBuild与 64 位编译器和工具配合使用。 另请参阅此 Stack Overflow 帖子:如何使Visual Studio使用本机 amd64 工具链。
文件权限不正确
如果文件权限不足,无法访问 文件名,则可能会出现此错误。 如果使用普通用户帐户访问受保护系统目录中的库文件,则可能会发生此情况。 或者,如果使用从其他用户复制的文件,这些文件仍具有其原始权限集。 若要解决此问题,请将文件移动到可写项目目录。 如果移动的文件具有不可访问的权限,请在管理员命令窗口中运行takeown.exe命令以获取文件的所有权。
磁盘空间不足
如果磁盘空间不足,可能会出现此错误。 链接器在多个用例中使用临时文件。 即使有足够的磁盘空间,大型链接也会耗尽或碎片可用磁盘空间。 请考虑使用 /OPT (优化) 选项;执行可传递 COMDAT 消除会多次读取所有对象文件。
TMP 环境变量中的问题
如果 文件名 名为 LNKnnn,则它是由临时文件的链接器生成的文件名。 TMP 环境变量中指定的目录可能不存在。 或者,可以为 TMP 环境变量指定多个目录。 应只为 TMP 环境变量指定一个目录路径。