首页 > 解决方案 > 为什么使用 MS Release 库时编译器会链接到错误的方法?

问题描述

在发布模式下程序链接到错误的方法。我有使用 VS2019 WIN32 构建的 9 个项目的 C++ 解决方案。它在 Debug 构建中运行良好,但在 Release 中构建时失败并出现错误: 运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。 从不是我的 dll 中的方法调用返回时会发生这种情况。

我做了一个新配置,它是 Debug 构建的副本。它运行得很好。然后,我将所有 9 个项目中的预处理器定义从 _DEBUG 更改为 NDEBUG,并重建了解决方案。它运行得很好。然后,我在所有 9 个项目中将运行时库从“多线程调试 DLL (/MDd)”更改为“多线程 DLL (/MD)”,并重建了解决方案(需要一个小时的大部分时间)。这次我在运行时收到上面显示的堆栈错误。

跟踪反汇编,我发现 /MD 版本以 3 个指针作为参数调用了预期的方法,但它执行的方法只有一个参数,因此清理在堆栈上留下了 8 个字节,从而产生了错误。根据包含文件,所需的方法是一个相当大的类中的虚函数。在遇到错误方法之前,该类在运行时有几个成功的方法调用。为了验证,我将所有 9 个运行时库改回 /MDd,重新构建,并获得了一个正在运行的程序。

在所有预处理器定义相同的情况下,库版本链接有何不同?

标签: windowsvisual-studiovisual-c++linker

解决方案


解决方案是获取动态链接库的发布版本。显然供应商发布了一个调试版本。MS 必须在 Debug 中链接额外的东西,使偏移量在 Release 模式下向上移动一个指针。


推荐阅读