windows - 为什么使用 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,重新构建,并获得了一个正在运行的程序。
在所有预处理器定义相同的情况下,库版本链接有何不同?
解决方案
解决方案是获取动态链接库的发布版本。显然供应商发布了一个调试版本。MS 必须在 Debug 中链接额外的东西,使偏移量在 Release 模式下向上移动一个指针。
推荐阅读
- excel - 如何使用 FindFirst 函数比较 2 个内存记录集?
- c++ - 从断言调用时缺少 llvm-cov 覆盖
- python - 如何在 Python 中循环 GET 请求以从数据帧中的分页 API 接收所有数据
- docker - Consul 连接 Docker 容器中的上游接口
- javascript - 如何从 jquery 对话框中跟踪链接
- html - 如何使输入的边框位于父 div 的前面?
- regex - 最多包含三个单词的正则表达式
- r - R - data.frame 中来自现有数据的新条件列不起作用
- .net - 使用 .net core 2.1 和 Azure 上传大文件
- r - dplyr `nth()` 无法通过管道传输 [长度错误(n)== 1]