ios - 将2个静态库链接到1个iOS版中

标签 ios xcode

我已经在Xcode中创建了两个单独的静态库以供在iOS上使用:A和B。A使用B中定义的方法。

当创建一个同时需要A和B的新Xcode项目时,我可以分别包含它们。但是,为了简化集成,我更喜欢创建一个同时包含A和B的通用框架。

是否可以在Xcode中将2个静态库合并为1个,而无需在1个项目中合并2个库的代码。换句话说。在编译/链接静态库A时,可以通过某种方式将已编译的静态库B链接到静态库A吗?

如果可能的话,我该怎么做?

最佳答案

我刚刚运行了一些快速测试,它似乎是自动发生的。这是我所做的:

  • 我将 DerivedData 文件夹用作所有3个项目的默认构建位置(这在我使用的XCode 4.2中是默认设置)
  • 我将公共(public)标题文件夹路径更改为 include/ProjectX ,其中X是静态库的名称。我仅对静态库A和B进行了此步骤,而不对实际链接它们的项目进行了此步骤。此步骤将能够导入诸如<LibX/Header.h>的 header 。
  • 我使库B与库A直接相关,并将A与B链接起来
  • 我使库成为主项目的直接依赖项,并将主项目与A
  • 链接在一起

    完成此基本设置后,我使用类似于<LibB/Header.h>的东西将类从B导入到A,并编写了一些实际上使用B的代码。然后,我使用<LibA/Header.h><LibB/Header.h>将A和B导入了主项目,并编写了使用A和B。最后,我使用终端转到 DerivedData 文件夹,并导航到构建A的位置。我检查了LibA.a是否包含来自LibB的对象,它们具有:
    nm LibA.a
    

    是的,它包含来自LibB的对象。因此,总而言之,通过这种简单的依赖关系设置,您应该能够获得所需的内容。

    编辑
    要使B直接依赖于A并将A与B链接起来,请执行以下操作:

    在XCode中打开A,转到Finder,然后将B项目文件拖放到A。然后,在A中选择根元素,转到Build Phases,展开Target Dependencies,按“+”按钮,选择B并确认。然后展开Link Binary With Libraries,按“+”按钮,选择B.a(或任何产品名称)并确认。

    重要
    XCode中有一个错误,阻止您正确地将B项目文件拖放到A工作区中。相反,您将在A工作区中保留B项目文件,但是无法展开B并对其执行任何操作。要变通解决此问题,请从A中删除错误的B项目文件引用,然后关闭A,如果已打开,则关闭B。然后重新打开A并使用Finder导航到B项目文件,然后将B拖放到A工作区中。如果不起作用,请重复。

    EDIT2
    如果您无权访问B(可能还有A)的源代码,则只需在适当的位置复制所需的 header 即可。然后,在您的主项目中,您没有直接依赖A,而是链接到您拥有的静态libA.a。如果A使用B,则来自B的符号已经在libA.a中。您可以像上面一样使用 nm 工具进行检查。因此,我们只能使用B header 将这些符号公开给主应用程序。有两种方法可以实现,我记得我只是将 header 复制到了依赖项链中间的库的“复制 header ”目标路径中。之后,通过链接到A并将A header 添加到用户 header 搜索路径中,我可以直接访问B。对您而言,最佳方法是什么,取决于您是否有权访问A的来源。如果有,则有两个选项可供考虑:
  • 将B header 添加到A(它们将被自动复制到A header 目的地)。但是我想你不想要这个解决方案。
  • 将自定义运行脚本构建阶段添加到A目标,它将捕获B header 并将其复制到A header 目标。

  • 在这两种情况下,您最终都拥有LibA.a(其中包含A和B的已编译源),以及headers文件夹(其中包含来自A和B的标题)。然后,您可以再次链接主项目LibA.a,并将headers文件夹路径添加到您的主项目中的用户标题搜索路径,您应该会很高兴。

    重要

    如果您的库中有仅包含类别代码的文件,请确保将此库与 -force_load 链接,否则类别符号将无法正确打包。

    关于ios - 将2个静态库链接到1个iOS版中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531014/

    相关文章:

    ios - iTunes 连接 : "Release this version" delay?

    objective-c - 从 5.1 更改部署目标时构建失败

    ios - Google Calendar JSON 提要到 TableView

    c - Xcode 更改/删除评论模板

    xcode - iOS 标签栏 Controller 中的动态数据

    ios - UIStackView 在 Interface Builder 中的显示有所不同

    ios - 我必须创建一个可变字典,但出现 "Incompatible pointer types initializing"错误

    ios - NSPredicate 过滤数组但只返回对象的一个​​字段

    objective-c - PDF 在 iOS 4.3 中显示不正确,但在 iOS 5.0 及更高版本中正常显示

    cocoa - 在代理后面使用 WebView (cocoa)