链接器工具错误 LNK1104

无法打开文件“filename”

当链接器无法打开文件以进行读取或写入时会报告此错误。 该问题的两个最常见原因是:

  • 你的程序已经在运行或已加载到调试器中,并且

  • 你的库路径不正确,或者没有用双引号括起来。

此错误有许多其他可能的原因。 要缩小范围,首先检查文件文件名的类型。 然后,使用以下部分来帮助识别和解决特定问题。

无法打开你的应用或其 .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++ 目录”属性页中指定的“库目录”中是否提供了所需的库。 检查每个配置的属性,例如 Debug、Retail、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++ 目录”属性页中指定的路径。 设置路径中的版本以匹配新的 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 注释 ( lib, "library_name" ) 指令中查找问题。 检查你的拼写和文件扩展名,并验证文件是否存在于指定位置。

并行生成同步

如果你使用的是并行生成选项,Visual Studio 可能已将文件锁定在另一个线程上。 要解决此问题,请确认未在多个项目中生成相同的代码对象或库。 使用生成依赖项或项目引用来获取项目中构建的二进制文件。

IDE 中指定的其他依赖项

当你直接在“其他依赖项”属性中指定单个库时,请使用空格分隔库名称。 不要使用逗号或分号。 如果你使用“编辑”菜单项打开“其他依赖项”对话框,请使用换行符来分隔名称,而不是逗号、分号或空格。 在“库目录”和“其他库目录”对话框中指定库路径时也使用换行符。

路径太长

当文件名的路径扩展到超过 260 个字符时,你可能会看到此错误。 如果需要,可重新排列目录结构或缩短文件夹和文件名以缩短路径。

文件太大

此错误可能是由于文件太大而导致的。 大小超过 1 GB 的库或目标文件可能会导致 32 位链接器出现问题。 此问题的一种可能解决方法是使用 64 位工具集。 有关如何在命令行中使用 64 位工具集的更多信息,请参阅如何:在命令行中启用 64 位 Visual C++ 工具集。 有关如何在 IDE 中使用 64 位工具集的信息,请参阅将 MSBuild 与 64 位编译器和工具一起使用。 另请参阅此 Stack Overflow 帖子:如何使 Visual Studio 使用本机 amd64 工具链

文件权限不正确

如果你没有足够的文件权限来访问文件名,则可能会发生此错误。 如果你使用普通用户帐户访问受保护的系统目录中的库文件,则可能会发生这种情况。 或者,如果使用从其他用户复制的文件,而这些用户仍具有其原始权限集。 要解决此问题,请将文件移动到可写项目目录。 如果移动的文件具有不可访问的权限,请在管理员命令窗口中运行 takeown.exe 命令以获取文件的所有权。

磁盘空间不足

当你没有足够的磁盘空间时,可能会发生该错误。 链接器在多个用例中使用临时文件。 即使你有足够的磁盘空间,大链接也会耗尽或分割可用磁盘空间。 请考虑使用 /OPT (优化) 选项;执行可传递 COMDAT 消除会多次读取所有对象文件。

TMP 环境变量中的问题

如果文件名命名为 LNK nnn,则它是链接器为临时文件生成的文件名。 TMP 环境变量中指定的目录可能不存在。 或者,可以为 TMP 环境变量指定多个目录。 只能为 TMP 环境变量指定一个目录路径。

求救,这里列出没有列出我的问题!

如果此处列出的问题均不适用,则可以使用 Visual Studio 中的反馈工具寻求帮助。 在 IDE 中,转到菜单栏并选择“帮助”>“发送反馈”>“报告问题”。 或者,使用“帮助”>“发送反馈”>“发送建议”提交建议。 还可以使用 Microsoft Learn Q&A 网站提问,以及 Visual Studio C++ 开发人员社区网站。 使用这些网站搜索问题的答案并寻求帮助。 有关详细信息,请参阅如何使用 Visual C++ 工具集或文档报告问题

如果你发现了一种解决此问题的新方法,我们应该将其添加到本文中,请告诉我们。 你可以使用此页面下方的按钮向我们发送反馈。 使用它在我们的 C++ 文档 GitHub 存储库中创建一个新问题。 谢谢!