C++ 在MSVC+;中使用静态链接在调试配置中编译DLL时发生链接器错误+;2010

C++ 在MSVC+;中使用静态链接在调试配置中编译DLL时发生链接器错误+;2010,c++,visual-c++,dll,linker,linker-errors,C++,Visual C++,Dll,Linker,Linker Errors,对于DLL项目的调试构建,我想尝试使用/MTd链接器选项而不是/MDd。我对发布版本使用静态链接。在调试配置中,我得到链接器错误: 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(MSVCP100

对于DLL项目的调试构建,我想尝试使用/MTd链接器选项而不是/MDd。我对发布版本使用静态链接。在调试配置中,我得到链接器错误:

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,都提到了这个base12
break.obj
是按字母顺序排列的第一个文件,因此其他文件可能也会出现问题。我在此文件中未定义任何具有此名称的函数。那里发生了什么?

可能会发布一些构建日志-某些东西导致DLL运行时处于链接步骤中

确保清理所有内容并执行完整重建。如果这没有帮助,请确保没有一个或多个源文件的任何文件级项目设置,这可能会导致重新生成该文件以链接到DLL运行时。据我所知,没有简单的方法从IDE中识别这样的文件级覆盖。直接在文本编辑器中查看构建日志或
.vcxproj
文件可能有助于缩小范围。如果查看
.vcxproj
文件,则具有项目替代的源文件将在文件的
元素中具有替代设置的XML元素,其中大多数
元素将没有子元素

最后,如果它不是太大,您可能想看看从头开始重新创建项目是否有帮助(我知道这很激烈,不应该是必要的,但有时它有助于摆脱古怪)


作为旁注,MSDN说():

由于通过链接到静态CRT构建的DLL将有其自己的CRT状态,因此不建议在DLL中静态链接到CRT,除非特别需要并理解其后果

顺便说一下,
\u Container\u base12
是一种用于迭代器检查/调试的类型-这就是为什么在任何源文件中都不能直接看到它或它的任何成员函数的原因。您应该确保使用
\u HAS\u ITERATOR\u debug
\u SECURE\u SCL
宏设置时没有做任何错误的操作。但我认为这与你的具体问题无关。如果您最终认为它们与您的问题有关,您可能希望查看:


+1我想,在这个答案中,旁注是最重要的部分。