【问题标题】:How can I ignore LNK2038 (define mismatch)? [duplicate]如何忽略 LNK2038(定义不匹配)? [复制]
【发布时间】:2013-01-02 20:32:32
【问题描述】:

可能重复:
LNK2038, iterator mismatch error, need to ignore

我有一个第三方静态库,它也与 C/C++ 运行时静态链接。我只有这个库的发布版本。

当我尝试将此库链接到我的应用程序的调试版本时,链接器抱怨静态库的迭代器调试级别 (0) 与我的应用程序的级别 (2) 不匹配。

有没有办法强制链接器忽略这个错误?我希望能够在调试模式下使用此库添加的功能,并且无法获得此库的调试版本。

顺便说一句,我无法立即想到这种定义不匹配会引起的任何问题。

【问题讨论】:

  • 你用的是什么编译器?
  • 你能发布确切的错误吗?如果您在谈论 Visual C++ 中的 C++ 标准库迭代器在调试版本和发布版本之间的实现方式非常不同,这很可能是一个问题。
  • 您可以创建一个新的 DLL 链接到该静态库中,然后动态链接到您的新 DLL,但这将是一个巨大的痛苦。
  • @BoPersson:这不是重复的。我了解此错误是什么以及如何修复它,但修复对我来说是不可能的。我在问如何强制链接器忽略这种不匹配并继续链接。

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


【解决方案1】:

标准说“迭代器在容器更改后未定义”。一些调试模式 STL 会检查这个错误,而大多数发布模式 STL 不会检查。在调试模式下的容器或迭代器类中有额外的成员变量来实现这些检查。

因此混合调试和发布 STL 版本将不起作用,因为容器或迭代器类中的字节数可能不同。对于在调试模式和发布模式之间具有不同成员变量的任何类,都会发生同样的情况。

【讨论】:

  • 我不明白为什么这会或可能是一个问题,因为标准库容器和类型不会跨库边界传递,并且第三方库有它自己的运行时静态链接。
  • 警告 - 这里有很多猜测。假设第 3 方库使用 std::vector 并且您的代码使用 std::vector 但该类型不用作第 3 方库提供的任何函数的参数或返回类型。大多数编译器试图通过只实例化一个模板版本来最小化代码膨胀。那么您的 exe 是否使用 std::vector 的调试或发布模式实例化?
  • 这可能无法回答您的问题,但希望对您有所帮助。通常,您调试构建将 _ITERATOR_DEBUG_LEVEL 设置为 2,而发布构建将其设置为 0。这导致了 LNK2038。如果您想将应用程序的调试版本与库的发布版本混合,您可以将#define _ITERATOR_DEBUG_LEVEL 0 添加到您的代码中。它应该可以工作。
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2012-10-29
  • 1970-01-01
  • 2014-08-05
  • 2019-08-29
  • 2012-07-02
相关资源
最近更新 更多