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

Gre*_*egH 18 vb.net dll visual-studio-2008 visual-c++

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

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

如果设置为"多线程调试DLL(/ MDd)", 那么一切正常.我从DLL中获得了正确的功能

如果设置为"多线程DLL(/ MD)"然后DLL无法正常运行...没有运行时错误或任何东西,它只是不起作用(DLL应该在地图上绘制一些线但不在这种模式下).

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

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

Ric*_*son 10

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

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

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


Meh*_*ran 6

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


小智 6

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

它与通过DLL接口传递std :: strings和std :: lists有关。

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

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