【问题标题】:"Unresolved external symbol __except_handler4_common" in Visual Studio 2015Visual Studio 2015 中的“未解析的外部符号 __except_handler4_common”
【发布时间】:2015-10-30 06:23:20
【问题描述】:

我正在 Visual Studio 2015 中编译旧版 Visual Studio 6.0 C++ 应用程序,我遇到了这个错误,在网上搜索并没有找到任何有用的信息。

函数 __except_handler4 (MSVCRT.lib) 中引用的 LNK2019 未解析的外部符号 __except_handler4_common

我知道代码中的某处引用了当前版本的 MSVCRT 中不再存在的方法(?)。是否有解决方法/编译器标志?

【问题讨论】:

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


    【解决方案1】:

    错误消息实际上是在 MSVCRT.LIB 中定义的函数 __except_handler4 引用了未定义的符号 __except_handler4_common。因此,进行此引用的不是您的代码,而是 Visual Studio 2015 的代码。

    符号__except_handler4_common 在vcruntime.lib 中定义。这个文件应该自动链接进去。我不知道为什么没有。是否在项目选项中选择了静态运行时库(“多线程(/MT)”),然后手动添加了 MSVCRT.LIB(动态 C 运行时库的一部分)?

    【讨论】:

    • 谢谢,罗斯。非常感激。 vcruntime.lib 目录包含在我的库路径中(它们是在 VC++ 6.0 到 Visual Studio 2015 项目转换期间添加/导入的),但错误使它看起来(对我来说)它由于某种原因没有被链接。如果我将 vcruntime.lib 添加到“附加依赖项”,错误就会消失,但我不完全理解为什么会这样。
    • 这为我指明了正确的方向。我相信我有一个类似的错误。我们有一个旧的 C++ 可执行文件,可以在我们的应用程序中生成和使用。当我尝试在发布模式下构建时,我会收到 80 个构建错误,类似于上面描述的错误。我最终在我的项目属性中检查了 Linker->Input->Additional Dependencies 页面。出于某种原因,有人将 msvcrt.lib 添加到“忽略特定默认库”属性中。我不知道为什么,但我删除了它,瞧,它内置发布没有问题。
    • 在我的例子中,我有一个使用静态运行时的工作程序,但后来我添加了一个静态库,它被设置为将运行时用作 DLL。修复它们以使用相同的运行时解决了这个问题。
    【解决方案2】:

    对我来说,我是从非静态单元测试链接到静态项目的对象。我尝试将单元测试设置为静态构建,但随后编译器(VC++ 2015)收到错误An internal error has occurred in the compiler。我最终将主项目和单元测试项目都设置为“在共享 DLL 中使用 MFC”,然后它就可以工作了。

    【讨论】:

      【解决方案3】:

      在您的库项目中,检查属性 -> C/C++ -> 代码生成 -> 运行时库

      可能是设置为“多线程调试 DLL”(/MDd)。

      如果是这种情况,请尝试将其更改为“多线程调试”(/MTd)并重建(这对我有用)。

      【讨论】:

      • 错误的原因取决于,所以最好你说这对我有用。
      • @Dexter 更好吗?
      【解决方案4】:

      这个错误的原因取决于。

      对我来说,链接器输入中明确列出了“libcmt.lib”和“libcmtd.lib”,而不是从 GUI 的“运行时库”字段中选择它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多