【问题标题】:What is __CxxFrameHandler4 and what does linker error "unresolved external symbol __CxxFrameHandler4" mean, exactly?什么是__CxxFrameHandler4,链接器错误“未解析的外部符号__CxxFrameHandler4”到底是什么意思?
【发布时间】:2021-04-16 17:17:03
【问题描述】:

我正在针对我的 Visual C++ 项目使用几个通过 vcpkg 构建的库(例如 civet-web 和 prometheus-cpp)。在构建 x86 时一切都很完美,在 x64 中我得到一堆链接器错误:

错误 LNK2001:无法解析的外部符号 __CxxFrameHandler4

在线搜索此符号/错误的所有引用都是关于特定项目的,我找不到 __CxxFrameHandler4 以及此错误突出显示的问题。我不知道是 vcpkg 构建库的方式有问题,还是我的项目有问题,或者如何开始寻找解决方案。

我确实找到了这篇博客文章,但它参考了 VS2019 的预览,我找不到与它相关的任何设置:https://devblogs.microsoft.com/cppblog/making-cpp-exception-handling-smaller-x64/

如果有人能解释这是什么意思,那将是一个很大的帮助。

【问题讨论】:

  • __CxxFrameHandler4 是较新的(自 VS 2019 16.3 起)64 位 FH4 异常处理的一部分。我猜LNK2001 可能会发生,如果您链​​接使用不匹配的编译器/工具集版本构建的模块。

标签: visual-studio visual-c++ vcpkg


【解决方案1】:

我在尝试通过 vcpkg 安装和使用 cpr 时遇到了同样的问题。我想在 VS2015 项目中使用 cpr 库。

原因:我安装了 VS2019。 vcpkg 使用最新版本的工具集 Visual Studio。
解决方案:添加您自己的三元组或更改现有工具集以使用您指定的工具集。在我的情况下添加不起作用,所以我更改了 vcpkg 中三元组文件夹中现有的“三元组”文件。我希望 vcpkg 使用 VS2015 附带的工具集(它是 V140)

x86-windows.cmake 文件的内容

set(VCPKG_TARGET_ARCHITECTURE x86)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)
set(VCPKG_PLATFORM_TOOLSET "v140")
set(VCPKG_DEP_INFO_OVERRIDE_VARS "v140")

x64-windows.cmake 文件的内容

set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE dynamic)
set(VCPKG_PLATFORM_TOOLSET "v140")
set(VCPKG_DEP_INFO_OVERRIDE_VARS "v140")

【讨论】:

  • 自发布以来,我实际上最终明白了这一点,我不得不强制 vcpkg 不使用最新的 vs2019 工具集。您可以为看到此内容的其他人演示示例三元组更改
  • @Mr.Boy,最后两行已添加。在这两种情况下,前 3 行都已经存在。
【解决方案2】:

一个更普遍的答案是,如果您混合使用不同平台工具集构建的对象,例如

  • Visual C++ 2015 (v140)
  • Visual C++ 2017 (v141)

通常,您(或其他人)可能已经使用不同的编译器版本(平台工具集)构建了项目的依赖项,并修复它以更改您的项目或依赖项的平台工具集(或使用正确的构建依赖项,如果你使用了预构建的包)

【讨论】:

    【解决方案3】:

    我认为您指出了正确的文章 https://devblogs.microsoft.com/cppblog/making-cpp-exception-handling-smaller-x64/

    在将使用 VC143 工具集构建的 64 位库与使用 VC141 工具集构建的 64 位应用程序链接时,我遇到了类似的问题。

    将以下属性添加到 VC143 构建的静态库项目后,我能够构建应用程序。这将禁用上面文章中提到的新功能(异常处理更小)

    VS2019->Properties->C/C++->Command Line add '-d2FH4-'
    VS2019->Properties->Linker->Command Line add '-d2:-FH4-' 
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多