当我在代码中添加以下行时:
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
,不知何故,错误消失了。但是,我真的不明白它的区别是什么以及它的工作原理。有人可以解释一下我究竟改变了什么以及为什么会有所改变?
谢谢!
答案 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,则可以在项目属性中修改这些选项:Configuration Properties | C/C++ | Code Generation
。
您必须选择最适合您需求的选项。但是,您应该提供适当的静态库,其中包含所需的函数传输。您从发布配置切换到调试配置,这就是编译器抱怨的原因(默认的Debug和Release配置已经将相应的库设置为链接)。
答案 4 :(得分:1)
不同之处在于/Mdd
指定运行时的调试版本,而/MD
则不指定。/MDd
。 _DEBUG
设置std::string sFrameTag
符号,如果在#ifdef _DEBUG
语句中声明了{{1}},那么这可能就是您的问题。请查看this MSDN article以供参考。