Brett Hall
Brett Hall

Reputation: 933

__crt_debugger_hook defined in both ucrtd.lib and msvcrtd.lib?

I'm in the process of converting a native C++ Visual Studio 2010 project to Visual Studio 2015 and after fixing a bunch of other stuff I'm finally at the linking stage which is failing with the following error

ucrtd.lib(ucrtbased.dll) : error LNK2005: __crt_debugger_hook already defined in msvcrtd.lib(utility_desktop.obj)

Thinking it may be a C-runtime library mismatch I went back and recompiled all our dependencies using VS2015 and the /MDd switch to control which run-time is used. That didn't fix anything.

According to dumpbin the symbol __crt_debugger_hook is in both libraries, but it only appears in a symbol table in msvcrtd.lib.

There are other executables in my solution that link with ucrtd.lib and msvcrtd.lib yet don't suffer from this problem. The executable that does experience the link failure also links with MFC and BCG, but I don't see how that could be the cause.

Does anyone have any other ideas for what could be causing this problem?

Upvotes: 1

Views: 1638

Answers (2)

Brett Hall
Brett Hall

Reputation: 933

It turns out that the bug isn't in Microsoft's library. Instead it's in the Crypto++ (https://www.cryptopp.com/) library. They forward declare _crt_debugger_hook in a way that is incompatible with changes that were made by Microsoft when they split the c-runtime into ucrtd.lib and msvrtd.lib. The offending line is fipstest.cpp at line 21:

extern "C" {_CRTIMP void __cdecl _CRT_DEBUGGER_HOOK(int);}

the _CRTIMP needs to be removed so that you have

extern "C" {void __cdecl _CRT_DEBUGGER_HOOK(int); }

I've opened a pull request with the Crypto++ folks to fix this (https://github.com/weidai11/cryptopp/pull/151).

Upvotes: 7

Brett Hall
Brett Hall

Reputation: 933

After spending some time going back and forth with MS technical support it sounds like this is a bug in VS2015. They couldn't give me any information on when a fix will be available but I can say that it isn't fixed by either update 1 or 2 for VS2015.

Upvotes: 0

Related Questions