我有一个项目需要合并两个第三方库libA和libB。我对第三方库的影响力即使有也很小。问题是 libA 和 libB 都包含公共库 ASIHTTPRequest 的不同版本。结果,我收到如下错误:

-[ASIFormDataRequest setNumberOfTimesToRetryOnTimeout:]: unrecognized selector sent to instance 0x3b4170

, ,我只能假设是因为 libA 指的是 libB 的 ASIHTTPRequest 实现(或相反)。

我尝试过玩 strip -s <symbol file> -u <library> 将库的符号彼此隔离,但这会导致 XCode 的链接器发出数千个警告,并且实际上并没有解决上面概述的主要问题。

ld: warning: can't add line info to anonymous symbol anon-func-0x0 from ...

一般来说,如何/应该如何将库彼此隔离?

有帮助吗?

解决方案

绝对没有办法这样做。一个 Objective-C 应用程序一次只能对一个符号具有一种含义。如果您加载一个库的两个不同版本,最后一个版本将覆盖第一个版本。

两种解决方法:

  1. 说服开发人员使用最新版本
  2. 在单独的进程中运行这两个库

其他提示

如果他们对不同的例程使用相同的链接器符号名称,唯一的出路(除了破解他们的目标文件)就是以某种方式将它们链接到不同的可执行文件。

在支持动态链接的平台上(例如:DLL),您可以将其中一个或两个构建到单独的 DLL 中。如果它们不是导出界面的一部分,则符号不应发生冲突。

否则,您将不得不将它们放入完全独立的进程中并使用 IPC 在它们之间传递数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top