我正在将原生C ++ Visual Studio 2010项目转换为Visual Studio 2015,并且在修复了一堆其他内容后,我终于处于链接阶段,但是出现以下错误失败< / p>
ucrtd.lib(ucrtbased.dll) : error LNK2005: __crt_debugger_hook already defined in msvcrtd.lib(utility_desktop.obj)
认为它可能是C运行时库不匹配我回去并使用VS2015和/ MDd开关重新编译所有依赖项以控制使用的运行时。那并没有解决任何问题。
根据dumpbin,符号__crt_debugger_hook
在两个库中,但它只出现在msvcrtd.lib中的符号表中。
我的解决方案中还有其他可执行文件与ucrtd.lib和msvcrtd.lib链接但尚未遇到此问题。确实遇到链接失败的可执行文件也与MFC和BCG有关,但我不知道这可能是什么原因。
是否有人对可能导致此问题的原因有任何其他想法?
答案 0 :(得分:5)
事实证明,这个错误不在微软的库中。相反,它位于Crypto ++(https://www.cryptopp.com/)库中。他们转发声明_crt_debugger_hook
的方式与Microsoft在将c-runtime拆分为ucrtd.lib和msvrtd.lib时所做的更改不兼容。违规行是第21行的fipstest.cpp:
extern "C" {_CRTIMP void __cdecl _CRT_DEBUGGER_HOOK(int);}
需要移除_CRTIMP
,以便您拥有
extern "C" {void __cdecl _CRT_DEBUGGER_HOOK(int); }
我已经用Crypto ++人员打开了拉取请求来修复此问题(https://github.com/weidai11/cryptopp/pull/151)。
答案 1 :(得分:0)
在花了一些时间来回与MS技术支持后,听起来这是VS2015中的一个错误。他们无法向我提供有关修复何时可用的任何信息,但我可以说VS2015的更新1或2都没有修复。