【发布时间】:2013-02-27 00:53:32
【问题描述】:
我正在开发一个链接多个静态库的 iOS 应用程序。挑战在于,这些链接库定义了具有不同实现的相同方法名称。奇怪的是,我没有收到任何 duplicate symbol definition 错误;但是,毫不奇怪,我最终只能访问该方法的一种实现。
更清楚地说,假设我有 libA 和 libB,它们都定义了一个名为 func1() 的全局 C 方法
当我链接 libA 和 libB,并调用 func1() 时,它解析为 libA 或 libB 的实现,而没有任何编译警告。但是,我需要能够分别访问 libA 的 func1() 和 libB 的 func1()。
There's a similar SO post 解释了如何在 C 中完成它(通过符号重命名),但不幸的是,正如我发现的那样,objcopy 工具不适用于 ARM 架构(因此是 iPhone)。
(我会将它提交到 App Store,因此,动态链接不是一个选项)
【问题讨论】:
-
如果你有任何一个库的源代码,那么解决方案是显而易见的。或者,您可以使用
lipo将两个库打包为一个,如果我没有记错的话,应该只保留其中一个符号。 -
感谢@RichardJ.RossIII,但我没有源代码并且不确定您的建议是否会有所帮助,因为我想单独保留这些符号,我需要它们,我不想减少他们到一个符号
-
我会说使用
dlopen和dlsym分别动态加载符号,但不幸的是,现在苹果禁止使用这些符号,这将不起作用。我不是.a文件结构方面的专家,但我觉得可以通过十六进制编辑器手动执行此操作。让我试试,看看能不能帮到你。
标签: ios xcode static-linking