在ucrtd.lib和msvcrtd.lib中都定义了__crt_debugger_hook吗?

Bre*_*all 1 c++ visual-studio-2015

我正在将本机C ++ Visual Studio 2010项目转换为Visual Studio 2015,并且修复了许多其他问题之后,我终于处于链接阶段,失败并出现以下错误

ucrtd.lib(ucrtbased.dll) : error LNK2005: __crt_debugger_hook already defined in msvcrtd.lib(utility_desktop.obj)
Run Code Online (Sandbox Code Playgroud)

认为这可能是C运行时库不匹配的原因,我回去并使用VS2015和/ MDd开关重新编译了所有依赖项,以控制使用哪个运行时。那没有解决任何问题。

根据dumpbin的说法,该符号同时__crt_debugger_hook存在于两个库中,但仅出现在msvcrtd.lib中的符号表中。

我的解决方案中还有其他可执行文件与ucrtd.lib和msvcrtd.lib链接,但不会遇到此问题。遇到链接故障的可执行文件也与MFC和BCG链接,但是我不知道这可能是原因。

是否有人对导致此问题的原因有其他想法?

Bre*_*all 5

事实证明,该错误不在Microsoft的库中。相反,它位于Crypto ++(https://www.cryptopp.com/)库中。他们_crt_debugger_hook以与Microsoft将c运行时分割为ucrtd.lib和msvrtd.lib时所做的更改不兼容的方式转发声明。令人反感的行是第21行的fipstest.cpp:

extern "C" {_CRTIMP void __cdecl _CRT_DEBUGGER_HOOK(int);}
Run Code Online (Sandbox Code Playgroud)

_CRTIMP需要被如此撤职你有

extern "C" {void __cdecl _CRT_DEBUGGER_HOOK(int); }
Run Code Online (Sandbox Code Playgroud)

我已经与Crypto ++的人员打开了拉取请求以解决此问题(https://github.com/weidai11/cryptopp/pull/151)。