【问题标题】:MSVC 2010 linker error 2005 with std::cout in static libraryMSVC 2010 链接器错误 2005 与静态库中的 std::cout
【发布时间】:2011-06-05 21:08:30
【问题描述】:

我发现了其他人遇到此问题的示例,但他们的解决方案没有运气。我正在尝试在一个静态库中使用 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) 中定义

等等……

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

【问题讨论】:

  • 你到底想cout做什么?
  • 我只希望通过 boost 创建的新线程输出到用于创建 GUI 的进度,并将其用作调试和解决问题的简单方法(如果有)。
  • 您可以编辑您的问题以列出您的cout 声明吗?
  • 您是否在 MSVC 中链接静态编译的 boost 库和运行时 DLL?确保您要么同时使用动态 DLL 库,要么同时使用静态 DLL。

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


【解决方案1】:

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

【讨论】:

  • 它工作!谢谢,一个是调试的,另一个不是。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    具体来说,听起来你的静态库/也许 boost 可能已经用/MT 编译,它静态地链接了 MSVC 运行时。您似乎正在尝试使用默认选项(/MD,指向MSVCR100.DLLMSVCP100.DLL 的动态链接)编译代码。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2011-02-25
      相关资源
      最近更新 更多