当尝试使用旧的STD库和Windows SDK进行编译时出现链接错误

9
我有一个旧项目,它是在VS2005中编译的(非常遗憾)。由于必须与另一个具有VS2005 CRT、MFC等的进程正确链接,因此必须保留在VS2005中。现在,我需要在VS2015中使用旧的VS2005工具集来编译这个项目。我已经将项目的VC++目录更改为所有STD和Windows SDK头文件/库的旧文件夹(包括目录、引用目录、库目录、源目录)。尽管此技巧在使用VS2010时曾经起作用,但在使用VS2015时,我仍然遇到了一些奇怪的链接错误。
1>Project1.obj : error LNK2019: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,unsigned int,void (__thiscall*)(void *))" (??_M@YGXPAXIIP6EX0@Z@Z) referenced in function "public: virtual void * __thiscall PluginInterface::`vector deleting destructor'(unsigned int)" (??_EPluginInterface@@UAEPAXI@Z)
1>     1>
1>StdAfx.obj : error LNK2001: unresolved external symbol "void __stdcall `eh vector destructor iterator'(void *,unsigned int,unsigned int,void (__thiscall*)(void *))" (??_M@YGXPAXIIP6EX0@Z@Z)
1>     1>
1>Project1.obj : error LNK2019: unresolved external symbol "void __cdecl operator delete(void *,unsigned int)" (??3@YAXPAXI@Z) referenced in function __unwindfunclet$?getInstance@Project1@@SAPAV1@XZ$0
1>     1>
1>Project1.obj : error LNK2019: unresolved external symbol "void __cdecl operator delete[](void *,unsigned int)" (??_V@YAXPAXI@Z) referenced in function "public: virtual void * __thiscall PluginInterface::`vector deleting destructor'(unsigned int)" (??_EPluginInterface@@UAEPAXI@Z)

为什么它要寻找这个析构函数的内部实现?它不应该从头文件中获取实现吗?为什么在 VS2010 中可以运行而在 VS2015 中不行呢?

我该如何适当地修复它?


你尝试过将链接器输入属性设置为忽略默认库吗? - Mahesh
是的,它只会让情况更糟。那些符号仍然失踪了,还有其他一堆符号也失踪了。 - Yochai Timmer
1
这些是自动生成的辅助函数,Raymond Chen在这篇旧博客文章中谈到了它们。它们的名称已更改,现在在名称前加上“eh”前缀。我猜这与C++11中对static关键字所需的新行为有关。这不是你可以关闭的东西,没有使用/EH编译几乎没有解决方法,所以你基本上是完蛋了。 - Hans Passant
@HansPassant 谢谢,至少有了一些信息。我已经将其缩小到主要是静态内容,但还有其他奇怪的问题(比如那些操作符删除)。是否有一个隐藏的标志可以强制使用C99?或者忽略“功能”? - Yochai Timmer
1个回答

9
所以,在阅读了许多破坏性更改文档后,我发现了一个可以抑制这些新的C++14 delete 实现的标志,在此处,在放置 new 和 delete下。
添加标志/Zc:sizedDealloc-可删除缺少的operator delete()实现。
项目属性 -> 配置属性 -> C/C++ -> 命令行 -> /Zc:sizedDealloc-

您可以使用编译器选项/Zc:sizedDealloc-恢复旧行为。如果使用此选项,则不会存在两个参数的delete函数,也不会与您的放置删除操作符冲突。

对于eh vector destructor iterator错误,我已经开了一个单独的问题,并且在那里回答了它

嗨,我和你有相同的情况,但我的错误是error LNK2001: unresolved external symbol ___std_terminate。如何避免这种情况? - ilw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接