【问题标题】:What exactly is the "Multi-threaded Debug DLL" Runtime Library option doing in VS 2008?VS 2008 中的“多线程调试 DLL”运行时库选项到底是做什么的?
【发布时间】:2011-02-02 06:40:42
【问题描述】:

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

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

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

如果设置为 "Multi-threaded DLL (/MD)",则 DLL 无法正常运行...没有运行时错误或任何东西,它只是没有t 工作(DLL 应该在地图上绘制一些线,但在此模式下不能)。

那么问题来了,为什么使用 /MDd 标志会导致底层代码的功能更正,而 /MD 会导致功能不正确?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 2012-05-08
          • 2013-05-03
          • 1970-01-01
          • 2014-10-07
          相关资源
          最近更新 更多