静态库函数名称在Rdio和Google Core库之间发生冲突

abb*_*ood 5 objective-c ios cocoapods rdio google-signin

问题

这发生在两个静态库中,我无法访问源代码.

我正在尝试将Rdio SDK安装到我的项目中(使用这些说明).我的项目已经使用了很多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'
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

我尝试/研究过的

我已经做了一些研究,并试图看看我是否可以在这两个库中的任何一个中以某种方式更改/删除/隐藏该方法名称..但是我可以跨越这个苹果文档:

没有用于从该库的客户端隐藏动态库中定义的Objective-C类或方法的机制.

所以我有点卡住......任何想法?

小智 10

如果您有权访问源代码,则可以修改冲突变量或可见范围的名称(例如,将其设置为静态).

如果您无法访问使用库的源代码,可以联系贡献者以要求更改名称/添加前缀/更改功能/变量的可见性.

如果您对该选项不满意,可以修改其中一个库上的符号表以避免冲突.您可以通过更改冲突功能的可见性或重命名功能来修改符号表.

因为你使用的OS X,你需要有objconv由昂纳雾(objcopy把模拟)在本地机器上(见文档).

以下是修改库的符号表的步骤:

  1. 打开终端并找到您的图书馆
  2. path/to/rdio/rdio-ios-3.1.0/Rdio.framework/Rdio
  3. 列出构建胖库的体系结构
  4. lipo -info Rdio
  5. 提取第一个架构(armv7)
  6. lipo Rdio -thin armv7 -output Rdio_armv7
  7. 提取冲突的目标文件(RDPlayer.o)
  8. ar x Rdio_armv7 RDPlayer.o
  9. 列出目标文件中的符号以确保其中的冲突功能
  10. nm -gU RDPlayer.o
  11. 将功能的可见性从全局变为本地
  12. objconv -nl:_CreateDispatchTimer RDPlayer.o RDPlayer_new.o
  13. 删除旧的RDPlayer.o并将RDPLayer_new.o重命名为RDPlayer.o
  14. rm RDPLayer.o && mv RDPLayer_new.o RDPlayer.o
  15. 确保在目标文件上不再显示该功能
  16. nm -gU RDPlayer.o
  17. 将新对象文件替换为存档库中的旧对象文件并重建符号表
  18. ar r -s Rdio_armv7 RDPlayer.o
  19. 对其他体系结构重复步骤5-18
  20. 将所有体系结构重新组合到胖库中
  21. lipo Rdio_arm64 Rdio_armv7 Rdio_armv7s Rdio_i386 Rdio_x86_64 -create -output Rdio
  22. ...
  23. 利润