【问题标题】:Using two different third party libraries gives linking error使用两个不同的第三方库会导致链接错误
【发布时间】:2011-06-18 00:42:41
【问题描述】:

我在我的 VC++ 项目中使用了两个不同的第三方库。当我编译它们时,它会给我链接错误。

我已经检查了每个库的示例应用程序。 第一个库(Lib1)的示例应用程序设置

  • 1)在静态库中使用 MFC
  • 2)多线程调试

第一个库 (Lib2) 的示例应用程序设置

  • 1)在共享 dll 中使用 MFC
  • 2)多线程DLL

我通过添加将第一个库包含在项目中

#pragma comment(lib, "./lib/abc.lib") 

声明

通过将第二个库添加为附加依赖项将其添加到项目设置中。

现在它工作正常,但是当我尝试使用 Lib1 中的一些函数时,我得到了类似的错误

1>libcmtd.lib(tidtable.obj):错误 LNK2005: __encode_pointer 已经 在 msvcrtd.lib(MSVCR80D.dll) 中定义 1>libcmtd.lib(tidtable.obj):错误 LNK2005: __decode_pointer 已经 在 msvcrtd.lib(MSVCR80D.dll) 中定义 1>libcmtd.lib(dbgheap.obj):错误 LNK2005:_malloc 已经定义在 msvcrtd.lib(MSVCR80D.dll) 1>libcmtd.lib(dbgheap.obj):错误 LNK2005: _calloc 已经定义在 msvcrtd.lib(MSVCR80D.dll)

任何解决方案如何让我的项目与这两个库一起编译。我没有这些库的源代码,所以我无法编译它们。

【问题讨论】:

    标签: winapi visual-c++ shared-libraries linker-errors


    【解决方案1】:

    正确的解决方案是不使用库 1 的调试版本。您可以获取/使用发布版本吗? 这样您就不会链接到系统 dll 的调试和发布版本。

    如果您无法获得发布版本,那么您将不得不排除使用调试 .libs。

    link 解释了如何操作。

    以 d 结尾的库是调试版本 (libcmtd.lib)。这些是您希望排除的(用于您的发布版本)。对于调试版本,您需要排除发布库。

    【讨论】:

    • 我无法获得发布版本。我已经添加了 NODEFAULTLIB,但我得到了很多错误。所以看起来我需要明确指定所有这些库。我收到大约 700 个错误。是否有可以包含在 MFC 项目中的默认库列表?
    • 不包括您需要的库,而是排除您不想要的库。在您的示例中,对于发布版本,请忽略 libcmtd.lib。然后会发生什么?
    • 我添加了两个库 libcmtd.lib msvcrtd.lib 作为“忽略特定库”,但我仍然收到类似 1>Linking... 1>libcmtd.lib(tidtable.obj) 的错误:错误 LNK2005 : __encode_pointer 已在 msvcrtd.lib(MSVCR80D.dll) 中定义 1>libcmtd.lib(tidtable.obj) : 错误 LNK2005: __decode_pointer 已在 msvcrtd.lib(MSVCR80D.dll) 中定义
    • 如果我忽略了这两个库,那么上面的错误怎么会出现。
    • 您仍然会遇到问题,因为一个库是为 CRT 的 DLL 版本构建的,另一个是为 .lib 版本构建的。一般来说,你不想混搭,这是灾难的根源。
    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多