【问题标题】:Linker Error: Precombiled Library VC++ 6.0 with VC++ 8.0 Program链接器错误:预编译库 VC++ 6.0 与 VC++ 8.0 程序
【发布时间】:2012-06-05 03:00:01
【问题描述】:

我正在尝试为新系统重新编译一些代码。它涉及一个预编译的静态库,我没有它的源代码(只有标头),并且该库是使用 VC++ 6.0 或更早版本以及较旧的运行时库构建的。在具有 VC++ 6.0 的旧系统上,我的程序构建并运行良好,但我最近升级了一些东西,我不再可以访问 VC++ 6.0,只能访问 Express 2008 (9.0 w/SP)。

当我构建解决方案时,它会编译但有以下链接器错误:

1>libcpmtd.lib(xlock.obj) : 错误 LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) 已经定义 在 NOREC.lib(track.obj) 1>LIBCMT.lib(stdexcpt.obj) 中:错误 LNK2005: “公共:__thiscall std::bad_cast::bad_cast(char const *)” (??0bad_cast@std@@QAE@PBD@Z) 已经在 NOREC.lib(track.obj) 中定义 1>LIBCMT.lib(stdexcpt.obj):错误 LNK2005:“公共:__thiscall std::bad_cast::bad_cast(类 std::bad_cast const &)" (??0bad_cast@std@@QAE@ABV01@@Z) 已经定义在 NOREC.lib(track.obj) 1>LIBCMT.lib(stdexcpt.obj):错误 LNK2005: “公共:虚拟 __thiscall std::bad_cast::~bad_cast(void)” (??1bad_cast@std@@UAE@XZ) 已经在 NOREC.lib(track.obj) 中定义 1>LINK : 致命错误 LNK1104: 无法打开文件 'libcp.lib'

非常欢迎任何关于如何克服这个问题的想法。

【问题讨论】:

    标签: visual-c++ linker microsoft-runtime-library


    【解决方案1】:

    从上一个链接错误开始,找不到libcp.lib。自 VS 2005 起,此库已被删除。对于多线程版本,请使用 /MT

    http://msdn.microsoft.com/en-us/library/abx4dbyh%28v=vs.80%29.aspx

    多线程版本是libcpmt.lib,您将使用/MT 标志自动获得它。我在您使用的第一个错误中看到libcpmtd.lib,这是相同的调试版本。如果您不使用/MTd,我不确定您是如何得到的。 (或者如果你是,libcp.lib 是如何被引用的,因为你应该使用一个或另一个,而不是两者)

    【讨论】:

    • 你说的是真的,但在这种情况下并不相关——我正在使用 /MT,但我没有编译调用该库的静态库。我想知道是否有办法在不重建库的情况下克服这个问题(我无权访问源代码)。
    • 如果您使用的是/MT,请检查您的“附加库”路径(我不知道 VS2008 怎么称呼它)以确保没有手动添加 libcpmtd.liblibcp.lib。它们基本上是同一运行时的不同版本,一个调试多线程,另一个单线程。而且由于完全删除了单线程版本,它绝对不应该在您的构建配置中。
    • 旧库是用旧的运行时库编译的...我知道这就是导致这个问题的原因,但我不知道是否有办法让这个工作。我认为这种方法既不简单也不优雅,但它可以将我的博士学位缩短 6 个月到一年
    • 我检查了配置,根本没有引用它。
    • 我认为静态库此时不会有任何链接依赖项,因为从技术上讲它们还没有“链接”。当然这是MS。我以前曾与第三方 DLL 进行过这些战斗,但这是可以理解的。静电没那么多。抱歉,我没有更多。
    【解决方案2】:

    链接器告诉你一些符号被定义了不止一次。说服链接器生成目标图像的蛮力是使用 /FORCE:MULTIPLE 作为explained here。这个开关我用过几次。

    【讨论】:

    • 谢谢,这会将第一组错误变成警告(希望不会出现运行时错误)。真正让我害怕的错误没有改变,致命错误 LNK1104: cannot open file 'libcp.lib',我认为这与 NOREC.lib 需要过时的运行时库有关。关于如何完成这项工作的任何想法?
    • 我的猜测是不会出现运行时错误(因为这是一个链接失败,告诉您您考虑了一个或多个库)。正如 Daver Rager 所提到的,从 VS2K5 开始,libcp.lib 已被删除。从您的项目中删除此库。
    【解决方案3】:

    链接:致命错误 LNK1104:无法打开文件“libcp.lib”

    这是链接器中的错误。只需在 LIBPATH 中创建一个名为 libcp.lib 的空文件。

    【讨论】:

      【解决方案4】:

      libcp.lib你可以在安装的MS Visual Studio 6.0中找到

      c:\Program Files\Microsoft Visual Studio\VC98\Lib\ 
      

      目录。

      只需将其复制到您的MSVS 2005/2008/2010 lib 目录即可 (即c:\Program Files\Microsoft Visual Studio 8\VC\lib\) 一切都会编译得很好。

      【讨论】:

      • 除了...不要这样做。只需链接一个支持的版本的 C 运行时。
      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 2023-03-27
      • 2012-11-02
      相关资源
      最近更新 更多