3

我发现了其他人遇到这个问题的例子,但他们的解决方案没有运气。我正在尝试在一个静态库中使用 std::cout,该库也使用 boost 线程和绑定。当我不使用它并且std::cout它编译并与主程序链接很好但是当我这样做并且我编译库时我没有问题但是当我编译和链接使用静态库的主程序时我得到了很多类似的东西:

2>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xi_z 已在 MSVCRTD.lib(cinitexe.obj) 中定义
2>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xc_a 已在 MSVCRTD.lib(cinitexe.obj) 中定义
2>LIBCMT.lib(crt0init.obj) : 错误 LNK2005: ___xc_z 已在 MSVCRTD.lib(cinitexe.obj) 中定义
2>LIBCMT.lib(mlock.obj) : 错误 LNK2005: __unlock 已在 MSVCRTD.lib(MSVCR100D.dll) 中定义
2>LIBCMT.lib(mlock.obj) : 错误 LNK2005: __lock 已在 MSVCRTD.lib(MSVCR100D.dll) 中定义
2>LIBCMT.lib(winxfltr.obj) : 错误 LNK2005: __XcptFilter 已在 MSVCRTD.lib(MSVCR100D.dll) 中定义
2>LIBCMT.lib(crt0.obj) : 错误 LNK2005: _mainCRTStartup 已在 MSVCRTD.lib(crtexe.obj) 中定义

ETC...

我尝试进入我的链接器设置并阻止它使用错误输出中列出的冲突库,但我无法正确处理。如果我告诉它停止使用一个库,它可能会解决问题但给我一些丢失的外部符号,然后我切换它有问题的库,但我仍然得到一些“已经定义”的库。我可以做些什么来解决这个问题的任何线索?我是否应该只创建另一个名为“log”的类或其他东西,然后从主 .exe 访问它(它将使用字符串库,这可能会再次导致问题,但我还没有尝试过)?感谢您的任何帮助。

4

3 回答 3

9

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

于 2011-01-08T20:55:11.003 回答
3

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

Boost可能就是其中之一。检查链接器的附加依赖项设置。IIRC,.libs 的名称中有 mt 或 md 。

于 2011-01-08T20:55:33.577 回答
2

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

具体来说,听起来您的静态库/也许 boost 可能已经编译,/MT其中静态链接 MSVC 运行时。看起来您正在尝试使用默认选项(/MD, 的动态链接MSVCR100.DLL, MSVCP100.DLL)编译您的代码。

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

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

我应该补充一点,D最后只是意味着调试。ieMSVCP100D.DLLMSVCP100.DLL.

于 2011-01-08T20:55:54.827 回答