VS 2008中的“多线程调试DLL”运行时库选项究竟是什么?

时间:2010-03-29 23:59:51

标签: vb.net visual-studio-2008 dll visual-c++

我在VS 2008中有一个创建DLL的解决方案。然后我在另一个应用程序中使用该DLL。如果我进入DLL项目属性页面并为DEBUG构建更改以下配置,则构建的dll不再提供所需的功能。如果我将其更改回来并重建DLL,那么DLL确实提供了正确的功能:

Property Pages =>配置属性=> C / C ++ =>代码生成=>运行时库

如果设置为 “多线程调试DLL(/ MDd)” 然后一切都按预期工作。我从DLL中获得了正确的功能

如果设置为 “多线程DLL(/ MD)” ,则DLL无法正常运行...没有运行时错误或任何事情,它只是没有'工作(DLL应该在地图上绘制一些线,但不在此模式下。)

所以问题是,为什么使用/ MDd标志会导致底层代码的纠正功能,而/ MD导致功能不正确?

一点背景......其他人用C ++开发了DLL,我在VB.net应用程序中使用这个DLL。

3 个答案:

答案 0 :(得分:9)

所有DLL /调试代码生成必须匹配使用它们的所有内容。可能存在另一个引用的库或对象或dll或某些使用错误选项构建的代码;或覆盖全局项目选项的单个元素的特定选项。

解决问题的唯一方法是仔细检查每个文件的所有选项,检查包含和引用的库(.lib和.dll)和目标文件。检查链接器选项。

它不起作用的原因可能是因为调试版本在内存周围添加了额外的保护块以允许检测错误。

答案 1 :(得分:6)

两个选项之间的主要区别在于您的代码稍后将链接到的库中。例如,对于调试版本,这将包括LIBCMTD.LIB和其他一些。如果您的库将作为调试构建,则应始终与MDd链接。如果不这样做,最多会导致许多未解决的外部链接器错误。有时代码会正常编译,但会在运行时崩溃。如果在vb.net中发生这种情况,则捕获可以轻松隐藏错误。我想你应该确保你的构建设置是正确的。有关详细信息,请查看this

答案 2 :(得分:6)

我有类似的问题。我的应用程序“使用”第三方DLL在其运行时库设置为“多线程DLL(/ MD)”时崩溃,但在其运行时库设置为“多线程调试DLL(/ MDd)”时工作。

它与在DLL接口上传递std :: strings和std :: lists有关。

我们的猜测是这两种类型的低级别定义在两个运行时库中有所不同。

我们使用此规则解决了相关问题... 必须使用完全相同的运行时库来构建DLL和DLL用户。