【问题标题】:Visual Studio C++ "Multithreaded Debug DLL" vs "Multithreaded DLL"Visual Studio C++“多线程调试 DLL”与“多线程 DLL”
【发布时间】:2012-01-23 19:26:38
【问题描述】:

我的一个项目仅适用于调试 DLL,而不适用于非调试 DLL。

  1. 在调试 DLL 设置下发布项目有哪些注意事项?例如,某些优化是否丢失?

  2. 如何通过将调试版本设置为非调试DLL来调试这个项目?我已经尝试过这样做,甚至将 _Debug 更改为 NDEBUG,但无论哪种方式,它都会给我同样的错误:

    未解析的外部符号 imp_CrtDbgReportW 在函数“public: class std::basic_string,class std::allocator > const & __thiscall std::_Vector_const_iterator,class std::allocator >,class std ::allocator,class std::allocator > > > >::operator*(void)const " (??D?$_Vector_const_iterator@V?$_Vector_val@V?$basic_string@DU?$char_traits@D@std@@ V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@ std@@@std@@QBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@XZ)

所以我不知道如何调试此项目以解决仅在非调试编译器设置下发生的错误。

【问题讨论】:

  • 修复错误。它可能仍然存在于调试版本中,但您还没有看到它的清单。
  • 如果用debug编译你的项目,需要链接Debug DLL,否则需要链接release DLL。你不能混搭。另外,请勿自行更改_DEBUG
  • @David - 我怀疑这个符号只应该存在于代码的调试版本中。我怀疑发布版本配置错误,因此它试图在仅调试符号中编译...
  • 调试 DLL 不可再分发。您不能发布使用它构建的版本。

标签: c++ visual-studio-2010 visual-c++ visual-studio-debugging


【解决方案1】:

看起来您可能正在构建的发布配置中定义 _DEBUG,或者您直接调用 _CrtDbgReport() 而不将其包含在 #ifdef _DEBUG 中。

http://msdn.microsoft.com/en-us/library/8hyw4sy7%28v=vs.80%29.aspx

生成带有调试消息的报告并将报告发送到 三个可能的目的地(仅限调试版本)。

该函数只能在调试版本中调用...

在回答您的其他问题时,通常不能选择发布调试版本,因为您还必须随二进制文件一起提供 MS 调试运行时,而这不在您与 Microsoft 的服务合同中。此外,构建将没有优化,并且可能会比您的发布构建慢一个数量级......

您可以使用以下代码重现此错误,它将在发布和调试模式下编译,但在发布模式下会产生与您看到的类似的链接器错误:

#define _DEBUG

#include "windows.h"
#include <crtdbg.h>

int _tmain(int argc, _TCHAR* argv[])
{
    _CrtDbgReportW(_CRT_ASSERT, NULL, NULL, L"some module", NULL);
    return 0;
}

【讨论】:

    【解决方案2】:

    我刚刚遇到了类似的症状(“我的项目仅适用于调试 DLL,而不适用于非调试 DLL”)。与您不同,我没有收到任何错误消息。我的程序没有任何生命迹象...

    我的程序(Internet Explorer 的附加组件 (BHO))在 Windows XP、Windows 7 和 Windows 8 上运行良好,但在 Windows 8.1 上却无法正常运行。我已将问题减少到运行时库中的差异。在我的.vcxproj 文件中发现了以下标签:

    <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> (Debug build)
    <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> (Release build)
    

    我为这两个版本启动了Process Monitor,并发现了一个“MSVCP100.dll”条目,结果为“NAME_NOT_FOUND”见下面的截图。此错误仅发生在 Release 版本中。

    MSVCP100.dll 是 Visual C++ 2010 运行时的一部分,在 Windows 8.1 (Windows Blue) 上似乎没有默认安装。可以从微软32-bits version64-bits version 下载并安装VC2010。安装运行时后,问题解决了,我的扩展又可以正常工作了。

    Procmon 截图

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多