【问题标题】:Using vcpkg with Visual Studio 2022 produces a bogus unresolved external symbol linker error将 vcpkg 与 Visual Studio 2022 一起使用会产生虚假的未解决的外部符号链接器错误
【发布时间】:2022-01-13 01:12:54
【问题描述】:

我有一个 MFC C++ 项目,它可以在 Windows 10 上使用 Visual Studio 2022 构建和运行良好。该项目根本不使用 Qt。在我使用 vcpkg 安装 Qt 6.2.1 后,项目停止构建并出现此链接器错误:

1>Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj) : error LNK2019: unresolved external symbol main referenced in function WinMain

同样,我的项目中没有使用 Qt6。转到项目的Configuration Properties 并禁用Use Vcpkg 使其再次构建。这里发生了什么以及如何在不禁用 vcpkg 的情况下修复它?


我使用 VS 项目向导和默认设置创建了一个新的 C++ MFC 应用程序。它在启用 vcpkg 的情况下构建良好。


我能提供的唯一合理的解释是,在许多代以前,较旧的 VS,较旧的 Windows,我的项目使用 Qt4 核心中的一些类有一段时间,这导致了问题,因此删除了该功能。我继续在没有安装 Qt 的 Windows 上开发它。有没有可能对 Qt 的一些引用仍然存在?如何找到它?我检查了几次设置,但没有找到。


我查看了库搜索的顺序 (/VERBOSE:Lib),在启用 vcpkg -> Use Autolink 的情况下,首先搜索 vcpkg 文件夹。有没有办法让链接器先搜索系统文件夹?

这是发生了什么:

1>    Searching C:\src\vcpkg\installed\\x64-windows\lib\Qt6EntryPoint.lib:
1>      Found WinMain
1>        Referenced in msvcrt.lib(exe_winmain.obj)
1>        Loaded Qt6EntryPoint.lib(qtentrypoint_win.cpp.obj)

/NODEFAULTLIB:"Qt6EntryPoint.lib" 排除Qt6EntryPoint.lib 无效。有没有其他方法可以排除?

【问题讨论】:

  • 但是你确实使用了 Qt,你正在链接它。您可能没想到的是,MFC 和 Qt 都是要定义程序入口点的框架,因此它们可以足够早地初始化。链接器选择了 Qt 的 WinMain()。修复它有点尴尬,你必须先链接 MFC 库。 IIRC,链接依赖是用#pragma lib注入的,你必须明确地命名它。
  • @HansPassant 但你确实使用 Qt 不,我没有。链接器虚假地拾取它。我将查看#pragma lib 或尝试从构建中排除 Qt6EntryPoint.lib。

标签: c++ visual-studio linker-errors lib vcpkg


【解决方案1】:

这意味着您应该在 vcpkg 中打开一个问题。
Qt6EntryPoint.lib 需要移动到 /manual-link 子文件夹中。
(我真的很讨厌 vcpkg 懒惰的 MSBuild 自动链接/链接所有功能。)

【讨论】: