我发现了其他人遇到这个问题的例子,但他们的解决方案没有运气。我正在尝试在静态库中使用std :: cout,该库还使用boost螺纹并绑定。当我不使用时 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)

ETC...

我已经尝试进入我的链接器设置,并使用错误输出中列出的冲突库将其停止使用,但我无法正确处理。如果我告诉它停止使用一个库,它可能会解决问题,但要给我一些缺少的外部符号,然后我切换库,它遇到问题,但我仍然得到一些“已经定义”。我能做什么解决此问题的线索?我应该只做另一个称为“日志”之类的类,然后从main .exe访问它(它将使用字符串库,这可能会再次引起问题,但我还没有尝试过)?感谢您的任何帮助。

有帮助吗?

解决方案

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

其他提示

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

提升可能是一个。检查链接器的其他依赖关系设置。 iirc,.libs的名字有MT或MD。

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

具体来说,听起来您的静态lib /也许是与 /MT 它将MSVC运行时链接到静态上。看起来您正在尝试使用默认选项编译代码(/MD, ,一个动态链接 MSVCR100.DLL, MSVCP100.DLL).

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

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

我应该补充说 D 最后只是意味着调试。 IE MSVCP100D.DLL 是调试版本 MSVCP100.DLL.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top