提问人:Yochai Timmer 提问时间:6/29/2017 更新时间:7/9/2017 访问量:3377
尝试针对旧的 STD 库和 Windows SDK 进行编译时出现链接错误
Link errors when trying to compile against an old STD library and windows SDK
问:
我有一个用 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 中工作?
我怎样才能正确解决这个问题?
答:
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
评论