【问题标题】:iOS duplicate symbols from different versions of the same library来自同一库的不同版本的 iOS 重复符号
【发布时间】:2015-01-09 15:59:52
【问题描述】:

应用 A 需要第三方库 B 和 C。B 和 C 都包含不同版本的库 D(来自其他第三方)。 没有可用的第三方源代码。 这将在链接应用程序时出现重复符号错误。

有哪些解决方案?


涉及相同库的相关问题,允许简单地删除一个副本:How to handle duplicate symbol error from 3rd party libraries?

【问题讨论】:

  • 给出的答案是一种完全有效的方法。使用有什么问题?
  • 如果两个版本的库不是二进制兼容的,那么删除一个副本会破坏依赖它的代码。
  • 在这种情况下,您可以采取的方法并不多——您必须将 B & D 合并到一个共享框架中,只公开 B 提供的类;然后对 C & D 做同样的事情,那么你应该能够将 B & C 链接到 A;不过,我不知道在这种情况下,objective-c 运行时会如何表现。这是我用于 C/C++ 库的一种方法,但我从未在 Objective-c 中尝试过。另外,我不知道在这种情况下,objective-c 运行时是否会做正确的事情

标签: ios objective-c xcode static-libraries duplicate-symbol


【解决方案1】:

通过重命名 B 中的冲突符号(及其版本的 D 如果单独)解决了这个问题。 这可以直接在二进制文件上完成,只要重命名的长度与原始文件的长度相同(例如,通过反转库前缀)。

local $/ = "\0";
open my $fh, '<+', $library;
binmode $fh;

while (my $field = <$fh>) {
    my $length = length $field;
    chomp $field;

    if (defined $translation{$field}) {
        seek $fh, -$length, SEEK_CUR;
        print $fh $translation{$field};
    }
}

【讨论】:

  • 您能否详细说明我们如何使用它?
  • @KrishnaKumar 这是 Perl 的 sn-p 演示如何直接在二进制文件上重命名符号。哈希 %translation 应该已经存在,并且包含所需的重新映射。
  • 感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 2023-04-03
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2018-08-14
相关资源
最近更新 更多