Visual Studio C ++“多线程调试DLL”与“多线程DLL”

时间:2012-01-23 19:26:38

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

我的一个项目只适用于Debug 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>中引用,类std :: allocator,类std :: allocator>>>> :: operator *(void)const“(?? D?$ _ Vector_const_iterator @ V?$ _ Vector_val @ V?$ basic_string @ DU?$ char_traits @ d @性病@@ V'$ @分配器@ d @@ 2性病@@ V'$ @分配器V'$ @的basic_string杜?$ @ char_traits @ d @@性病V'$ @分配器@ d @@ 2 STD @@@ 2 @@ STD @@@ STD @@ QBEABV?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 1 @ XZ)

    因此我对如何调试此项目以解决仅在非调试编译器设置下发生的错误感到茫然。

2 个答案:

答案 0 :(得分:2)

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

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

  

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

只应在调试版本中调用此函数...

在回答您的其他问题时,发布调试版本通常不是一个选项,因为您还必须使用二进制文件发送MS Debug Runtime,而这不会出现在与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;
}

答案 1 :(得分:0)

我刚刚遇到了类似的症状(“我的项目仅适用于调试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”请参见下面的截图。此错误仅发生在发布版本中。

MSVCP100.dll是Visual C ++ 2010运行时的一部分,在Windows 8.1(Windows Blue)上似乎默认不安装它。可以从Microsoft 32-bits version64-bits version下载并安装VC2010。安装运行时后,问题得到解决,我的扩展程序再次运行。

Procmon的截图

procmon