【问题标题】:Controlling export of third party symbols in an iOS / iPhone SDK在 iOS / iPhone SDK 中控制第三方符号的导出
【发布时间】:2012-08-11 23:29:27
【问题描述】:

如果您正在构建将包含在其他人代码中的商业 iOS SDK,并且您拥有获得许可的第三方库,是否有一种有效的方法可以通过不导出这些第三方库/框架结构来简化这些库/框架结构静态库中的派对符号?

我很感激我可以指导开发人员检查重叠符号,但我想尽量减少说明。即,只是希望他们将 lib 放入他们的项目中,然后离开。我也不想导出我的第三方符号,因为它们可能会在以后的项目中发生变化。

【问题讨论】:

    标签: ios static export symbols


    【解决方案1】:

    不幸的是,这里没有很多事情可以轻松完成。静态库只是一堆粘在一起的 .o 文件。没有链接器步骤来确定 .o 之间实际需要哪些片段。直到最后的链接步骤(由您的客户)才完成。

    也就是说,你可以考虑一些事情:

    • 首先,尽可能避免在静态库中包含子库。如果客户有可能拥有同一个子库的其他副本,这真的很危险。由于您的子库已获得许可,因此您的情况似乎有所不同,因此客户不太可能拥有多个副本,但是例如,您永远不应该在静态库中包含 libcurl 的静态副本。您必须要求客户自己链接 libcurl,否则事情将对他们来说非常糟糕。 (请参阅Linking static libraries, that share another static library。)同样,这听起来可能不适用于您,但如果您有常用的开源库,请记住这一点。

    • 处理可见性的老派解决方案是将编译单元粘合在一起。这是一种“将所有 .c/.m 文件连接成一个大文件并进行编译”的奇特方式。您标记为“静态”的任何函数在此编译单元之外都将不可见,因此不应导出。这也恰好增加了库内编译器内联和其他优化(特别是没有花哨的链接时优化)的可能性。

    【讨论】:

    • 我也很怀疑。我可能会在第三方类前面加上前缀,这样就不会有任何冲突。我有源代码。真的不想要多个库。另外,来自 qa p.o.v.不想担心不同版本的库。
    【解决方案2】:

    Symbol Exporting Strategies。您有多种选择:

    1. 将符号标记为静态(在这种情况下可能不可能,因为它们来自第 3 方)
    2. 使用导出的符号列表或未导出的符号列表
    3. 直接设置符号的可见性属性(同样,在这种情况下可能是不可能的)
    4. 编译时使用-fvisibility 命令行选项(可能是您最好的选择)
    5. 使用弱导入
    6. 使用弱库

    这些在上面的链接中有解释。

    【讨论】:

    • 那些似乎是 Dylib 设计指南。在 iOS 上,Xcode 中的 dylib 不支持(没有明显的 hackage)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 2013-09-22
    • 1970-01-01
    • 2019-03-25
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多