使用cocoapods构建静态库

时间:2013-06-13 16:56:38

标签: ios xcode static-libraries cocoapods

我正在尝试构建一个在Podfile中指定的具有不同依赖关系(例如AFNetworking)的静态库。我不希望依赖项包含在最终的静态库中(调用libMyProject.a),我只想链接它们,然后创建一个MyProject.Podspec文件,我可以在其中放置相同的依赖项。

问题在于,当我构建libMyProject.a时,libPods.a被链接和包含,所以如果我分发libMyProject.a而其他人将它集成到一个使用一些相同依赖项的项目中,它将具有重复的符号的问题。

如何链接libPods.a lib但不包含在libMyProject.a中?它应该像链接其他现有框架一样工作。

谢谢!

3 个答案:

答案 0 :(得分:12)

我通过从Build Phases中的“Link Binary With Libraries”部分删除libPods.a lib来解决它。

答案 1 :(得分:6)

虽然从“Link Binary with Libraries”构建阶段手动删除libPods.a确实有效,但真正的答案是不要让它首先添加到那里。

添加它的原因是pod install命令正在查找静态库目标作为其链接目标之一。这可能是因为它是列表中的第一个目标(如果你没有明确指定目标,cocoapods的实现会导致它选择第一个目标),或者可能是因为你已经在'link_with'部分中明确说明了它。 / p>

我找到的答案是使用Podfile的link_with部分明确说明目标,省略静态库目标

仍然会创建pods项目,并且您的依赖项会按照您的预期进入,但libPods.a不会添加到静态库的构建阶段。

唯一的问题是如何放入link_with部分,如果不是你的静态库。如果您有其他想要链接的目标(例如iPhone应用程序目标),那么这是一个不错的选择。但如果您唯一的真正目标是静态库,则需要一些解决方法。

到目前为止,我的成功策略是创建一个静态库目标(是的,与 main 静态库中的一个单独的目标)并称之为“Dummy”。在Podfile的link_with部分中指定此目标。

这有点令人反感,但是确实有效。

platform :ios, '5.1.1'

link_with ['Dummy']

pod 'AFNetworking', '= 1.3.1'

答案 2 :(得分:1)

默认情况下,引用的库不包含在静态库产品中。您看到的链接器冲突更可能是静态库和客户端应用程序都使用默认(隐式)Pod目标的结果。

每个Cocoapods生成的目标都包含一个编译到产品中的“Pods- target -dummy.m”文件;如果你使用默认的Pods目标,它就叫做“Pods-dummy.m”。当库和客户端都使用默认目标时,编译虚拟文件产生的相同符号将导致链接错误。

我自己尝试了Craig's answer的变体,发现link_with语句还负责连接Cocoapods生成的xcconfig,后者提供控制头搜索路径的编译器标志。当然,您可以手动添加xcconfig(或标题搜索路径项目设置),但我为我的团队寻找可重复的解决方案。

我的解决方案是为库创建一个显式目标,其名称不太可能导致与客户端项目冲突(例如,库的名称):

target 'XYZLibrary' do
    pod 'AFNetworking', '2.5.2'
    ...
end

如果静态库目标的名称(在Xcode项目中)不同,您可以在link_with块中包含target语句,但如果只有一个目标,我通常更喜欢使用两个地方都有相同的名称,因此不需要link_with

如果您有单位测试目标,请创建两个单独的目标。 (我目前def在两个目标中使用了一组常见的pod,因为抽象目标目前不是一个选项,但它们可能是一天。)它看起来像这样:

def common_pods
  pod 'AFNetworking', '2.5.2'
end

target 'XYZLibrary' do
  common_pods
end

target 'XYZLibraryTests' do
  common_pods
end

关键是Podfile的根目录中没有任何pod个元素,因此Cocoapods不会生成默认目标。这样,每个产品都会获得一个独特的“Pods- 目标 -dummy.m”,当这些目标文件链接在一起时就没有冲突。

相关问题