5

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

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

谢谢!!!

4

5 回答 5

6

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

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

于 2013-03-28T09:43:46.723 回答
4

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

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

于 2013-03-28T09:45:45.917 回答
1

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

有关详细信息,请参阅/MD、/MT、/LD(使用运行时库)

于 2013-03-28T09:44:24.523 回答
1

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

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

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

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

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

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

于 2013-03-28T09:44:58.593 回答
1

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

于 2013-03-28T09:46:55.503 回答