MSVC 2010链接器错误2005与静态库中的std :: cout

时间:2011-01-08 20:40:35

标签: c++ visual-c++ linker-errors lnk2005

我找到了其他人遇到这个问题但他们的解决方案没有运气的例子。我试图在一个也使用boost线程和绑定的静态库中使用std :: cout。当我不使用和std::cout它编译并与主程序良好链接,但当我这样做,我编译库我没有问题,但当我编译和链接使用静态库的主程序时我得到大量的事情:

2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj)
2>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR100D.dll)
2>LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj)

等...

我已尝试进入我的链接器设置并停止使用错误输出中列出的冲突库,但我无法正确使用它。如果我告诉它停止使用一个库它可以解决问题,但给我一些遗漏的外部符号,然后我切换它有问题的库但我仍然得到一些“已经定义”。有什么线索可以解决这个问题吗?我应该只创建另一个名为“log”或类别的类,只需从主.exe访问它(这将使用字符串库,这可能会再次引起问题,但我还没有尝试过)?谢谢你的帮助。

3 个答案:

答案 0 :(得分:9)

尝试检查 - >项目+属性,C / C ++,代码生成,运行时库。 您的.lib和您的主项目必须在此处使用相同的设置。

答案 1 :(得分:3)

右键单击项目,属性,C / C ++,代码生成,运行时库设置。这是你问题的根源。设置有/ MT和/ MD。您链接的代码具有此设置的冲突值,所有内容都必须使用相同的编译。

Boost可能是那个。检查链接器的Additional Dependencies设置。 IIRC,.libs的名字是mt或md。

答案 2 :(得分:2)

当两个编译对象包含相同的符号时,会发生LNK2005。当您尝试将它们链接在一起时,链接器不知道如何处理它与所有内容重复的事实,因此错误。

具体来说,听起来你的静态lib /也许是boost可能是用/MT编译的,它以静态方式链接MSVC运行时。看起来您正在尝试使用默认选项(/MD,一个指向MSVCR100.DLLMSVCP100.DLL的动态链接)编译代码。

请参阅http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx

您可以重建所述静态库,确保它与动态库链接,或者尝试静态链接代码。

我应该补充一点,D最后只是意味着调试。即MSVCP100D.DLLMSVCP100.DLL的调试版本。