我已经在Xcode中创建了两个单独的静态库以供在iOS上使用:A和B。A使用B中定义的方法。
当创建一个同时需要A和B的新Xcode项目时,我可以分别包含它们。但是,为了简化集成,我更喜欢创建一个同时包含A和B的通用框架。
是否可以在Xcode中将2个静态库合并为1个,而无需在1个项目中合并2个库的代码。换句话说。在编译/链接静态库A时,可以通过某种方式将已编译的静态库B链接到静态库A吗?
如果可能的话,我该怎么做?
最佳答案
我刚刚运行了一些快速测试,它似乎是自动发生的。这是我所做的:
<LibX/Header.h>
的 header 。 完成此基本设置后,我使用类似于
<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的来源。如果有,则有两个选项可供考虑:
在这两种情况下,您最终都拥有LibA.a(其中包含A和B的已编译源),以及headers文件夹(其中包含来自A和B的标题)。然后,您可以再次链接主项目LibA.a,并将headers文件夹路径添加到您的主项目中的用户标题搜索路径,您应该会很高兴。
重要
如果您的库中有仅包含类别代码的文件,请确保将此库与 -force_load 链接,否则类别符号将无法正确打包。
关于ios - 将2个静态库链接到1个iOS版中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9531014/