微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在使用 MS Release 库时编译器会链接到错误的方法?

如何解决为什么在使用 MS Release 库时编译器会链接到错误的方法?

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

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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。