用cocoapodsbuild立一个静态库

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

问题是,当我build立libMyProject.a libPods.a链接和包括,所以,如果我分发libMyProject.a和其他人集成在一个项目,使用一些相同的依赖关系,它将有重复的符号问题。

我如何链接到libPods.a库,但不包括它在libMyProject.a? 它应该像连接其他现有的框架一样工作。

谢谢!

我通过从构build阶段的“Link Binary With Libraries”部分删除libPods.a lib来解决这个问题。

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

它被添加的原因是因为pod install命令正在将静态库目标作为其目标之一进行链接。 这可能是因为它是列表中的第一个目标(如果您没有明确指定目标,cocoapods的实现会导致它select第一个目标),或者可能是因为您已经在“link_with”部分明确指出了目标。

我find的答案是使用Podfile的link_with部分显式指定您的目标,并省略静态库目标

pod项目仍然被创build,并且您的依赖项被带入到那里,但是libPods.a不会被添加到静态库的构build阶段。

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

到目前为止,我的成功策略是创build一个静态库目标(是的,从你的主要静态库中分离出一个),并称之为“Dummy”。 在Podfile的link_with部分指定这个目标。

这有点令人不快,但是它确实有用。

platform :ios, '5.1.1' link_with ['Dummy'] pod 'AFNetworking', '= 1.3.1' 

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

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

我自己尝试了一下Craig的答案 ,发现link_with语句也负责连接Cocoapods生成的xcconfig,它提供了控制标题searchpath的编译器标志。 你当然可以手动添加xcconfig(或者标题searchpath项目设置),但是我为我的团队寻找了一个可重复的解决scheme。

我的解决scheme是为库创build一个明确的目标,名称不太可能与客户端项目(例如库的名称)发生冲突:

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

如果静态库目标的名称(在Xcode项目中)不同,但是如果只有一个目标,我通常更喜欢在两个地方使用相同的名称,从而使link_with不必要。

如果您有unit testing目标,请创build两个单独的目标。 (我目前定义了一套用于这两个目标的常见豆荚,因为抽象目标目前不是一个选项,但可能有一天。)看起来像这样:

 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- target -dummy.m”,并且当这些对象文件链接在一起时不会产生冲突。