我有一个需要合并两个第三方库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 ...
一般而言,如何能/应该一个彼此隔离库?
问题是在Objective-C中没有隐藏的符号。如果两个库引用一个共同的第三个Obj-C库,这些符号总是可见的,因此是冲突的。单独的流程是避免这些问题的唯一方法。 – 2010-08-24 16:17:14
@Max Seelemann - 我认为这不重要。通常,动态加载的库(如DLL)中隐藏的符号对其他DLL或主程序不可见。过去我曾经使用过这种方法来允许使用冲突名称作为内部子例程和全局变量(并且打算在不同进程中运行)的库在相同的可执行文件中彼此兼容。 – 2010-08-24 20:00:24
这可能是相当正确的。但Objective-C拥有方法名称和运行时的中央注册表,无论它们来自哪里。没有办法在objc中隐藏或导出符号。所有符号都是公开的。 – 2010-08-25 07:29:52