我想尝试/ MTd链接器选项而不是/ MDd用于我的DLL项目的调试版本。我为Release版本使用静态链接。在Debug配置中,我收到链接器错误:
break.obj : error LNK2005:
"public: void __thiscall std::_Container_base12::_Orphan_all(void)"
(?_Orphan_all@_Container_base12@std@@QAEXXZ)
is already defined in msvcprtd.lib(MSVCP100D.dll).
共有5个类似的错误,break.obj
中的所有LNK2005,都提到了这个基础12。 break.obj
是按字母顺序排列的第一个文件,因此也许其他文件也会出现问题。我没有在此文件中定义具有此名称的任何函数。那里发生了什么?
答案 0 :(得分:2)
也许发布一些构建日志 - 导致DLL运行时处于链接步骤。
确保清理所有内容并执行完全重建。如果这没有帮助,请确保没有任何文件级项目设置用于一个或多个源文件,这可能导致重建它以链接DLL运行时。据我所知,从IDE中识别此类文件级覆盖并不容易。直接在文本编辑器中查看构建日志或.vcxproj
文件可能有助于缩小范围。如果查看.vcxproj
文件,带有项目覆盖的源文件将包含文件的<ClCompile>
元素中被覆盖设置的XML元素,其中大多数<ClCompile>
元素将没有子元素
最后,如果它不是太大,你可能想看看是否从头开始重新创建项目有帮助(我知道它是激烈的,不应该是必要的,但有时它有助于消除怪异)。
作为旁注,MSDN说(http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx):
因为通过链接到静态CRT构建的DLL将具有其自己的CRT状态,所以不建议将其静态链接到DLL中的CRT,除非特别希望并理解其后果。
顺便说一下,_Container_base12
是一个用于迭代器检查/调试的类型 - 这就是为什么你不直接在任何源文件中看到它或它的任何成员函数的原因。您应确保使用_HAS_ITERATOR_DEBUGGING
和_SECURE_SCL
宏设置未执行任何不正确的操作。但我认为这与您具体的具体问题无关。如果你最终认为它们与你的问题有关,你可能想看看: