如何针对发布版本的lib(MSVCRT.lib)构建调试.exe(MSVCRTD.lib)?

时间:2009-04-14 04:07:35

标签: c++ visual-studio visual-c++ linker

我正在使用Visual C ++ 2008,SP1。我在调试构建配置中有一个QT应用程序(gui,.exe)。它设置为使用CRT的多线程调试DLL版本,即MSVCRTD.lib。

我正在链接一个以发布模式构建的第三方库,并使用CRT的多线程DLL(非调试)版本,即MSVCRT.lib。

它链接并运行但在启动时崩溃。连接时我收到警告:

LINK:警告LNK4098:defaultlib'MSVCRT'与使用其他lib冲突;使用/ NODEFAULTLIB:库

我尝试设置/NODEFAULTLIB:msvcrt.lib

但由于缺少符号而导致5个链接错误。

所以不可能使用两个不同的库吗?有什么选择?我可以从我拥有的第三方库中创建一个DLL吗?或者这是第三方必须要做的事情?

启动时的例外是:

“在MyApp.exe中......处理未处理的异常:...... 访问冲突读取位置0x00000000f“

以下是应用程序运行后的调用堆栈,它崩溃了:

MyApp.exe!std::_Aux_cont::_Getcont()  + 0xa bytes   C++
MyApp.exe!std::_Iterator_base_aux::_Getmycont()  + 0x1b bytes   C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::const_iterator::operator*()  + 0x28 bytes  C++
MyApp.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> >,0> >::iterator::operator*()  + 0xf bytes C++
MyApp.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,unsigned int,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,unsigned int> > >::operator[]()  + 0xe9 bytes    C++
MyApp.exe!ThirdPartyLib::client::`anonymous namespace'::init_xlt_mode()  + 0x5f bytes   C++
MyApp.exe!_GetCommandLineW@0()  + 0x8d8f3 bytes C++
msvcr90d.dll!_initterm(void (void)* * pfbegin=0x006c4468, void (void)* * pfend=0x006cb0b8)  Line 903    C
MyApp.exe!__tmainCRTStartup()  Line 501 + 0xf bytes C
MyApp.exe!WinMainCRTStartup()  Line 403 C
kernel32.dll!7c817067()     

2 个答案:

答案 0 :(得分:10)

您可以构建项目以链接发布CRT并为您的代码启用调试信息。在“项目属性”中,转到C ++ / General并更改调试信息格式。在“优化”部分中,关闭优化。切换到“链接器/调试”部分并启用调试信息的生成。确保设置程序数据库文件(PDB)。

此时,您的应用程序将为您的代码中的所有内容发出调试信息,并链接到非调试DLL CRT。这使您可以在Release配置中调试应用程序,同时避免在同一应用程序中使用多个CRT相关的问题。

答案 1 :(得分:2)

在混合和匹配Debug和Release配置库时,我遇到过类似的问题。

虽然这有时可以起作用,但它也可能导致模糊的崩溃,例如您所看到的崩溃(可能由不匹配的入口点或类似的东西引起)。

我看到的替代方案是:

  • 在Release配置中构建您的应用程序(指向MSVCRT.dll)并查看是否有效(您将无法获得尽可能多的调试信息,但它可能有助于隔离问题的根源)

  • 如果第三方库是开源的,请尝试自己构建.lib文件的Debug版本。

  • 否则,请查看调试版本是否可在线获取,或与供应商联系。

抱歉,我无法提供更多帮助。我认为从长远来看,如果你能够访问正确的库,然后试图找到解决它的方法,那将会更快。