【问题标题】:What's the difference between /MD and /MDd (Use Run-Time library)?/MD 和 /MDd(使用运行时库)有什么区别?
【发布时间】:2013-03-18 16:35:33
【问题描述】:

当我在我的代码中添加以下行时:

std::string sFrameTag

我收到以下链接器错误:

错误 34 错误 LNK2005: "public: __thiscall std::basic_string,class std::allocator >::~basic_string,class std::allocator >(void)" (??1?$basic_string@DU? $char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) 已经定义在 VFPAnalyzerApi.lib(VFPEvaluation.obj) msvcprtd.lib

我查看了 C/C++ -> 代码生成 -> 运行时库 下的项目属性,并将其从 /MDd 更改为 /MD,不知何故错误消失了。但是,我真的不明白有什么区别以及为什么会起作用。有人可以解释一下我到底改变了什么以及为什么会有所不同吗?

谢谢!!!

【问题讨论】:

  • 一个是多线程DLL debug lib,另一个是多线程DLL release lib。你从前者走到了后者。暴露的对象,特别是连接到 debug-c-runtime-DLL 的标准对象的调试分配器,会导致从运行时库中导出的不同名称。因此,交叉链接将不起作用

标签: c++


【解决方案1】:

运行时库包含所有标准库类和函数的实现。您必须提供这些实现,这样您的程序才能运行,Visual Studio 为您提供了两种选择:

  • 运行时库不会编译到您的程序的二进制文件中,但是它需要在您的应用程序之前安装 Visual Studio 运行时(否则它将不起作用)
  • 运行时库将被编译成程序的二进制文件 - 这会稍微增加其大小,但不需要任何额外的运行时即可工作。

此外,您可以选择是否需要这些库的调试版本或发布版本。有四种选择:

  • /MDd - 多线程调试 DLL
  • /MD - 多线程 DLL
  • /MTd - 多线程调试
  • /MT - 多线程

如果您使用 Visual Studio,您可以在项目属性中修改这些选项:Configuration Properties | C/C++ | Code Generation

您必须选择最适合您需求的选项。但是,您应该提供适当的静态库,其中包含所需的函数传输。您从发布配置切换到调试配置,这就是编译器抱怨的原因(默认调试和发布配置已经设置了适当的库要链接)。

【讨论】:

    【解决方案2】:

    不同之处在于/Mdd 指定了运行时的调试版本,而/MD 没有。 /MDd 设置了 _DEBUG 符号,所以如果在 #ifdef _DEBUG 语句中声明了 std::string sFrameTag,这可能就是您的问题。请查看this MSDN article 以供参考。

    【讨论】:

      【解决方案3】:

      /MD 使用多线程 - DLL 运行时库。 /MDd 使用相同库的调试版本

      您可能正在使用另一个使用 MD 构建的库,因此链接到运行时库的发布版本。 (因此已经定义的错误)

      【讨论】:

        【解决方案4】:

        运行时库有多个版本(调试、多线程等)。在构建项目时,您需要确保所有内容都使用相同的版本,否则您会遇到问题中的错误。

        有关详细信息,请参阅/MD, /MT, /LD (Use Run-Time Library)

        【讨论】:

          【解决方案5】:

          MSDN 在这方面有很好的文档。

          简而言之,/MDd 将 C 和 C++ 标准库的调试版本的必要部分链接到您的 DLL 中。 /MD 类似,但使用标准库的 NDEBUG 版本。如果您尝试链接结合了调试和发布标准库的代码,则会出现符号冲突,因为这两个库将提供相同的功能集。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-18
            • 2014-07-26
            • 1970-01-01
            • 1970-01-01
            • 2021-04-19
            • 1970-01-01
            • 2017-05-22
            相关资源
            最近更新 更多