gpt4 book ai didi

c++ - 如何针对发布构建的库 (MSVCRT.lib) 构建调试 .exe (MSVCRTD.lib)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:32 27 4
gpt4 key购买 nike

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

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

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

链接:警告 LNK4098:默认库“MSVCRT”与其他库的使用冲突;使用/NODEFAULTLIB:库

我尝试设置/NODEFAULTLIB:msvcrt.lib

但是由于缺少符号,这导致了 5 个链接错误。

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

启动时的异常是:

“在 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()

最佳答案

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

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

关于c++ - 如何针对发布构建的库 (MSVCRT.lib) 构建调试 .exe (MSVCRTD.lib)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/746298/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com