链接同一个库的两个版本(相同的符号)

时间:2014-10-16 07:08:29

标签: ios clang static-linking

我正在开发一款iOS应用,并希望链接到特定的图书馆。但是,同一个库(带有碰撞符号)的分叉/旧版本已静态链接到我也使用的框架中。因为框架引入的版本是理想的分叉和过时我想以某种方式将新库用于我的目的,并允许旧的/分叉版本继续被框架使用,所有在一个iOS二进制文件。

我无法控制库的旧/分叉版本,但我可以编译新版本但是我可以。

我可以做些什么来自动为新版本的库中的符号添加前缀/命名空间,以便我可以使用它们而不会与旧版本中的符号冲突?

1 个答案:

答案 0 :(得分:3)

组合来自以下两个堆栈溢出帖子的信息:

通过查看PLCrashReporter,我想出了以下内容:

  1. 创建一个新的Cocoa Touch静态库" Wrapper"在XCode项目。

  2. 更改" Mach-O类型"将新的静态库添加到"可重定位目标文件"。

  3. 选择您不希望能够调试的重复库的哪个版本,即您必须丢弃重复库的一个副本的符号,这样您就赢了# 39;能够调试它。

    在我的情况下,我选择丢弃带有旧版本库/符号的预编译依赖项的符号。我做出这个决定是因为预编译的依赖是来自第三方,并且它无论如何都没有调试符号。

  4. 在新的Cocoa Touch" Wrapper"项目启用"执行单个对象预链接" 填充"预链接库"与您选择不能调试的库/依赖关系的相对路径。

  5. 我怀疑这一步并非实际需要,但我这样做是因为它似乎使我的意图更明确(关于构建设置)

    设置"默认隐藏的符号"到"是"在" Wrapper"项目,然后标记您打算导出的任何Objective-C类,C ++方法/类等:

    <强>属性((能见度(&#34;默认&#34;)))

  6. 在&#34; Wrapper&#34;项目集&#34;部署预处理&#34;到&#34;是&#34; 和&#34;剥离样式&#34; to&#34;非全局符号&#34; (在我们的例子中,这导致库中的Objective-C类别被错误地省略)

  7. 编写Objective-C类(C或C ++代码同样可以正常工作)从依赖项(其符号即将被丢弃)中包含您需要的功能,并公开一个小API(用于你原来的项目)。

  8. 此步骤对我来说很关键 - 添加Exported Symbols File并在其中准确指定要导出的符号(即上面提到的小API)。设置&#34;导出的符号文件&#34;将设置构建为此文件的相对路径(再次在&#34; Wrapper&#34;项目中)。

  9. 转到原始项目,从&#34; Link Binary with Libraries&#34;中删除您刚刚为其创建包装API的依赖项。构建阶段并将其替换为新的包装器库。您还需要更新项目中的任何代码以使用新的包装器API。

  10. 如果您还没有,请将新版本的库/库(之前导致符号冲突)添加到主项目中,并按正常情况使用这些API。