2010-08-24 58 views
2

我有一个需要合并两个第三方库libA和libB的项目。我对第三方库的影响甚微,如果有的话。问题在于libA和libB都包含不同版本的公共库ASIHTTPRequest。其结果是,我越来越像错误:我该如何隔离第三方的C/C++/ObjC库的符号?

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

,我只能假设是因为力霸是指libB的执行ASIHTTPRequest(或者反过来)的。

我试过玩弄strip -s <symbol file> -u <library>来隔离库中的符号,但这会导致XCode的链接器吐出数千个警告,并且实际上并未解决上述主要问题。

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

一般而言,如何能/应该一个彼此隔离库?

回答

1

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

两种解决方法:

  1. 说服开发人员使用最新版本
  2. 运行在单独的进程
0

如果他们为不同的程序使用相同的链接符号的名称都库中,只有出路(短缺他们的目标文件),是以某种方式将它们链接到不同的可执行文件中。

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

否则,你会被卡在完全独立的进程中,并使用IPC在它们之间传递数据。

+0

问题是在Objective-C中没有隐藏的符号。如果两个库引用一个共同的第三个Obj-C库,这些符号总是可见的,因此是冲突的。单独的流程是避免这些问题的唯一方法。 – 2010-08-24 16:17:14

+0

@Max Seelemann - 我认为这不重要。通常,动态加载的库(如DLL)中隐藏的符号对其他DLL或主程序不可见。过去我曾经使用过这种方法来允许使用冲突名称作为内部子例程和全局变量(并且打算在不同进程中运行)的库在相同的可执行文件中彼此兼容。 – 2010-08-24 20:00:24

+0

这可能是相当正确的。但Objective-C拥有方法名称和运行时的中央注册表,无论它们来自哪里。没有办法在objc中隐藏或导出符号。所有符号都是公开的。 – 2010-08-25 07:29:52