我正在开发一个iOS应用程序,它链接了几个静态库。挑战在于,这些链接的库定义了相同名称但实现不同的方法。奇怪的是,我没有收到任何“重复符号定义”错误;但是,毫不意外地,我最终只能访问该方法的一个实现。
更明确地说,假设我有libA和libB,它们都定义了一个名为func1()的全局C方法。
当我同时链接libA和libB,并调用func1()时,它会解析为libA或libB的实现,而没有编译警告。然而,我需要能够分别访问libA的func1()和libB的func1()。 有一个类似的SO帖子解释了如何在C中完成此操作(通过符号重命名),但不幸的是,正如我所发现的那样,objcopy工具无法用于ARM架构(因此也无法用于iPhone)。
(我将提交它到App Store,因此动态链接不是一个选项)
更明确地说,假设我有libA和libB,它们都定义了一个名为func1()的全局C方法。
当我同时链接libA和libB,并调用func1()时,它会解析为libA或libB的实现,而没有编译警告。然而,我需要能够分别访问libA的func1()和libB的func1()。 有一个类似的SO帖子解释了如何在C中完成此操作(通过符号重命名),但不幸的是,正如我所发现的那样,objcopy工具无法用于ARM架构(因此也无法用于iPhone)。
(我将提交它到App Store,因此动态链接不是一个选项)
lipo
将这两个库打包成一个库,这样应该(如果我的记忆没有出错的话)只会保留一个符号。 - Richard J. Ross IIIdlopen
和dlsym
动态加载符号,但很遗憾,由于苹果禁止使用这些功能,现在无法使用。我不是.a
文件结构的专家,但我有一种感觉,可以通过十六进制编辑器手动完成此操作。让我试试,看看能否帮助您。 - Richard J. Ross III