2

我有一个项目需要合并两个第三方库 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 ...

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

4

2 回答 2

1

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

两种解决方法:

  1. 说服开发人员使用最新版本
  2. 在不同的进程中运行这两个库
于 2010-08-24T16:09:58.410 回答
0

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

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

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

于 2010-08-24T16:10:14.570 回答