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

Link errors when trying to compile against an old STD library and windows SDK

提问人:Yochai Timmer 提问时间:6/29/2017 更新时间:7/9/2017 访问量:3377

问:

我有一个用 VS2005 编译的旧项目(可悲的是)。它必须保留在 VS2005 中,以便它可以正确链接到另一个具有 VS2005 CRT、MFC 等的进程。

现在我需要在 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 中工作?

我怎样才能正确解决这个问题?

C++ 链接器 visual-studio-2005 未解析的外部

评论

0赞 Mahesh 6/29/2017
您是否尝试过将链接器输入属性设置为忽略默认库?
0赞 Yochai Timmer 6/29/2017
是的,这只会让情况变得更糟。这些符号和其他一堆符号一起消失了。
1赞 Hans Passant 7/2/2017
这些是自动生成的辅助函数,Raymond Chen 在这篇旧博客文章中谈到了它们。他们的名字已经改变,现在在他们的名字前面加上“eh”的前缀。我猜这与 C++11 中静态关键字所需的新行为有关。这不是你可以关闭的东西,在没有 /EH 的情况下编译几乎不是一种解决方法,所以你几乎被搞砸了。
0赞 Yochai Timmer 7/3/2017
@HansPassant 谢谢,至少这是一些信息。我已将其范围缩小到主要静态内容,但还有其他奇怪的内容(例如那些运算符删除)。某处是否有隐藏的旗帜可以强制 C99 ?还是忽略“功能”?

答:

9赞 Yochai Timmer 7/3/2017 #1

因此,在阅读了大量重大更改文档后,我发现了一个标志,可以在此处Placement new 和 delete 下抑制这些新的 c++14 实现。delete

添加标志 /Zc:sizedDealloc- 会删除缺少的运算符 delete() 实现。
项目属性 -> 配置属性 -> C/C++ -> 命令行 -> /Zc:sizedDealloc-

可以使用编译器选项 /Zc:sizedDealloc- 还原到旧行为。如果使用此选项,则双参数删除 函数不存在,也不会与您的展示位置发生冲突 delete 运算符。

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

评论

0赞 ilw 2/5/2019
嗨,我有同样的情况,和你一样,但我的错误是如何避免这种情况?error LNK2001: unresolved external symbol ___std_terminate