Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 当使用MS Release库时,为什么编译器会链接到错误的方法?_Windows_Visual Studio_Visual C++_Linker - Fatal编程技术网

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

Windows 当使用MS Release库时,为什么编译器会链接到错误的方法?,windows,visual-studio,visual-c++,linker,Windows,Visual Studio,Visual C++,Linker,程序链接到发布模式中的错误方法。我有C++解决方案,用VS2019 Win32构建了9个项目。它在调试版本中运行良好,但在内置版本中运行失败并出现错误: 运行时检查失败#0-未在函数调用中正确保存ESP的值。 当从不是我的dll中的方法调用返回时,会发生这种情况 我创建了一个新配置,它是调试版本的副本。它运行得很好。 然后,我在所有9个项目中将预处理器定义从_DEBUG更改为NDEBUG,并重新构建了解决方案。它运行得很好。 然后,我在所有9个项目中将运行库从“多线程调试DLL(/MDd)”更改

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

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

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


当所有预处理器定义相同时,库版本链接如何不同?

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

我会设置一个空白项目,只链接该dll,并调用有问题的方法,以查看问题是否会复制。我不认为链接器与dll有任何关系,因为链接是在加载时或运行时动态进行的,为了澄清这一点,请使用
GetProcAddress
。这是一个简单的方法调用。没有模板,没有vtable操作,只有一个class->method(ptr,ptr,ptr)。深入研究include文件,在从主程序调用虚拟函数之前,将执行的方法直接声明为虚拟函数。除了运行库外,没有任何更改。包含文件、dll的库和dll都完全相同。什么能让链接器将调用移动4个字节?MatG:如果我花钱在一个较小的程序中复制这个/或不复制/这会告诉我什么?如果问题再次出现,你有一个较小且简单的项目要发布;如果问题没有重现,您可以缩小原因范围,并分析两个项目之间的差异。您继续谈论链接器,但它与DLL库无关:绑定发生在您运行程序时。