【问题标题】:How do you build a debug .exe (MSVCRTD.lib) against a release built lib (MSVCRT.lib)?如何针对发布构建的库 (MSVCRT.lib) 构建调试 .exe (MSVCRTD.lib)?
【发布时间】:2010-10-19 06:42:08
【问题描述】:

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

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

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

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

我尝试设置 /NODEFAULTLIB:msvcrt.lib

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

所以不能使用两个不同的库吗?什么是替代方案?我可以从我拥有的 3rd 方库中创建一个 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()     

【问题讨论】:

  • 你在启动时遇到了什么崩溃?
  • 嗨,我刚刚更新了上面的原始帖子,提供了更多详细信息和对您问题的回答。

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


【解决方案1】:

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

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

【讨论】:

  • 宾果游戏,这是一个救生员!我试图将此答案标记为解决方案,但由于某种原因它不允许我这样做。非常感谢!
【解决方案2】:

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

虽然这有时会奏效,但也可能导致不明显的崩溃,例如您所看到的崩溃(可能是由不匹配的入口点或类似原因引起的)。

我看到的替代方案是:

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

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

  • 否则,请查看 Debug 版本是否在线提供,或联系供应商。

很抱歉,我无法提供更多帮助。我认为从长远来看,如果您可以访问正确的库,然后尝试找出解决方法,这会更快。

【讨论】:

  • 我应该说,当我在发布模式下构建我的应用程序时它工作正常,但正如你所说,据我所知,我无法调试它,这使得事情有点像无意义。我问了供应商,他们起初似乎不认为他们可以提供调试版本。我正在努力说服他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2015-12-28
相关资源
最近更新 更多