gpt4 book ai didi

ios - Rdio 和 Google Core 库之间的静态库函数名称冲突

转载 作者:可可西里 更新时间:2023-11-01 04:17:20 33 4
gpt4 key购买 nike

问题

这发生在我没有访问源代码的两个静态库中。

我正在尝试将 Rdio SDK 安装到我的项目中(使用 these instructions )。我的项目已经使用了很多谷歌的服务,而且Rdio和谷歌之间似乎存在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:

There is no mechanism for hiding an Objective-C class or method defined in a dynamic library from the clients of that library.

所以我有点卡住了..有什么想法吗?

最佳答案

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

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

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

因为您使用的是 OS X,所以您需要 objconv由本地计算机 ( see documentation) 上的 Agner Fog(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. 利润

关于ios - Rdio 和 Google Core 库之间的静态库函数名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232305/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com