首页 文章

在MSVC 2010中使用静态链接在Debug配置中编译DLL时链接器错误

提问于
浏览
0

我想尝试/ 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个类似的错误,所有LNK2005都在 break.obj 中,都提到了这个base12的东西 . break.obj 是按字母顺序排列的第一个文件,因此也许其他文件也会出现问题 . 我不是在那里发生的吗?

1 回答

  • 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 是一个用于迭代器检查/调试的类型 - 's why you don't直接在任何源文件中查看它或它的任何成员函数 . 您应该确保使用 _HAS_ITERATOR_DEBUGGING_SECURE_SCL 宏设置没有做任何不正确的事情 . 但我认为这与您具体的具体问题无关 . 如果您最终认为它们与您的问题有关,您可能需要查看:

相关问题