这种情况发生在两个静态库中,我不可以访问源代码。
我尝试将Rdio SDK安装到我的项目中(使用these instructions)。我的项目已经使用了很多Google的服务,似乎在Rdio和Google之间存在C函数命名冲突:
duplicate symbol _CreateDispatchTimer in:
/Users/abdullahbakhach/dev/ios/Vibereel_IOS/Vibereel/Pods/Google/Libraries/libGGLCore.a(GMRAlarm.o)
/Users/abdullahbakhach/dev/ios/Vibereel_IOS/Vibereel/Vibereel/rdio-ios-3.1.0/Rdio.framework/Rdio(RDPlayer.o)
ld: 1 duplicate symbol for architecture armv7
Google Core is installed on my project using cocoapods, on my podfile I have:
pod 'Google/SignIn'
在Podfile.lock中我有:
- Google/Core (1.1.0):
- GoogleInterchangeUtilities (~> 1.0)
- GoogleNetworkingUtilities (~> 1.0)
- GoogleSymbolUtilities (~> 1.0)
- GoogleUtilities (~> 1.1)
- Google/SignIn (1.1.0):
- Google/Core
- GoogleSignIn (~> 2.0)
- GoogleAppUtilities (1.0.0):
- GoogleSymbolUtilities (~> 1.0)
- GoogleAuthUtilities (1.0.1):
- GoogleNetworkingUtilities (~> 1.0)
- GoogleSymbolUtilities (~> 1.0)
- GoogleInterchangeUtilities (1.0.0):
- GoogleSymbolUtilities (~> 1.0)
- GoogleNetworkingUtilities (1.0.0):
- GoogleSymbolUtilities (~> 1.0)
- GoogleSignIn (2.2.0):
- GoogleAppUtilities (~> 1)
- GoogleAuthUtilities (~> 1)
- GoogleNetworkingUtilities (~> 1)
- GoogleUtilities (~> 1)
- GoogleSymbolUtilities (1.0.0)
- GoogleUtilities (1.1.0):
- GoogleSymbolUtilities (~> 1.0.0)
我做了一些研究并试图看看我是否可以在这两个库中的任何一个中以某种方式更改/删除/隐藏该方法名称..但是我可以跨越this apple documentation:
没有机制可以从该库的客户端隐藏动态库中定义的Objective-C类或方法。
所以我有点卡住......有什么想法吗?
答案 0 :(得分:10)
如果您有权访问源代码,则可以修改冲突变量或可见范围的名称(例如,将其设置为静态)。
如果您无法访问使用库的源代码,可以联系贡献者,要求更改名称/添加前缀/更改功能/变量的可见性。
如果您对该选项不满意,可以修改其中一个库上的符号表以避免冲突。您可以通过更改冲突功能的可见性或重命名功能来修改符号表。
因为您正在使用OS X,所以您需要在本地计算机(objconv)上使用Agner Fog(类似于objcopy)see documentation。
以下是修改库的符号表的步骤:
path/to/rdio/rdio-ios-3.1.0/Rdio.framework/Rdio
lipo -info Rdio
lipo Rdio -thin armv7 -output Rdio_armv7
ar x Rdio_armv7 RDPlayer.o
nm -gU RDPlayer.o
objconv -nl:_CreateDispatchTimer RDPlayer.o RDPlayer_new.o
rm RDPLayer.o && mv RDPLayer_new.o RDPlayer.o
nm -gU RDPlayer.o
ar r -s Rdio_armv7 RDPlayer.o
lipo Rdio_arm64 Rdio_armv7 Rdio_armv7s Rdio_i386 Rdio_x86_64 -create -output Rdio
答案 1 :(得分:2)
有问题的符号是一个简单的 C函数,而不是一个方法(Objective-C方法不会在链接器级别上发生冲突)。
如果你有权访问源代码,你可以在函数定义的前面添加一个static
,看起来可能是这样的:
static dispatch_source_t CreateDispatchTimer(double interval, dispatch_queue_t queue, dispatch_block_t block)
该函数很可能是编译单元的本地函数,因此这将起作用。如果不是,则必须在整个库项目中重命名。