/ MD和/ MDd(使用运行时库)之间有什么区别?

时间:2013-03-28 09:40:07

标签: c++

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

std::string sFrameTag

我收到以下链接器错误:

  

错误34错误LNK2005:“public:__ thishisall 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,不知何故,错误消失了。但是,我真的不明白它的区别是什么以及它的工作原理。有人可以解释一下我究竟改变了什么以及为什么会有所改变?

谢谢!

5 个答案:

答案 0 :(得分:5)

MSDN有很好的文档。

简而言之,/MDd链接C& S调试版本的必要部分。将C ++标准库放入DLL中。 /MD类似,但使用标准库的NDEBUG版本。如果您尝试链接组合调试和发布标准库的代码,您将获得符号冲突,因为两个库都将提供相同的函数集。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

运行时库有多个版本(debug,multithreaded等)。在构建项目时,您需要确保所有内容都使用相同的版本,否则您会收到类似问题的错误。

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

答案 3 :(得分:1)

运行时库包含所有标准库类和函数的实现。您必须提供这些实现,以便您的程序可以工作,Visual Studio为您提供了两个选项:

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

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

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

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

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

答案 4 :(得分:1)

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