使用现有的静态库和iOS应用程序configurationCocoapods

我无法让我的工作空间与Cocoapods正确编译。 在工作区有3个项目,每个项目都有自己的目标:

  1. libPods – 具有所有外部依赖关系的Cocoapods静态库
  2. libCommon – 我的静态库,我保留所有的共享代码(基本控制器,networking代码,通用用户界面等)
  3. myApp – 我的iOS应用程序

libCommon和myApp都需要libPods的外部依赖。 本来我认为它会这样工作:

  1. libPods构build
  2. libCommon链接对libPods和生成
  3. myApp与libCommon链接并构build

在这种情况下libCommon“拥有”豆荚,然后myApp只是链接反对libCommon像我一直做的Cocoapods前…但显然静态库不喜欢与静态库链接(我有一堆dynamic库错误)。 我读了一个github问题的地方,而不是我应该build立libPods和libCommon,然后我的应该链接两个库。 现在我的podfile看起来像这样:

workspace 'MyApp.xcworkspace' platform :ios, '5.0' link_with ['Common', 'MyApp'] target 'MyApp' do xcodeproj 'MyApp.xcodeproj' pod 'AFNetworking', '1.1.0' pod 'TTTAttributedLabel', '1.6.0' pod 'JSONKit', '1.5pre' pod 'Reachability', '3.1.0' end 

使用这个设置,myApp拥有所有的豆荚,然后在libCommon的生成设置中,我指定了豆荚头的path。 这个构build好,直到我尝试使用libCommon中的一个类。 一旦我这样做,我得到_OBJC_CLASS_$_Blah错误之一(这告诉我,虽然头可用,它仍然没有正确链接)。 当我尝试在“Build Phases”中手动链接libCommon时,我得到一堆重复的符号错误(这让我相信它已经链接了)。 有没有搞错?

有什么办法做到这一点,我的podfile应该是什么样子?

CocoaPods创build一个隐含的根目标,默认情况下链接到项目的第一个目标。 在创build另一个目标时,link_with选项不会被子目标定义inheritance,因此您的设置不起作用。 为了使link_with选项可以在MyApp目标定义的块中移动它。

由于Common目标与Pod的链接,如果您将这些链接与MyApp关联在一起,则会导致重复的符号错误。 在这种情况下,您只需将标题提供给MyApp目标即可。 这很简单,但目前还没有一个合适的DSL,因此目前有点像一个解决scheme(但支持)。

 workspace 'MyApp.xcworkspace' platform :ios, '5.0' target 'Common' do pod 'AFNetworking', '1.1.0' pod 'TTTAttributedLabel', '1.6.0' pod 'JSONKit', '1.5pre' pod 'Reachability', '3.1.0' target 'MyApp', :exclusive => true do xcodeproj 'MyApp.xcodeproj' end end 

我为这种情况采取的解决scheme如下:

我很简单地设置了Podfile:

 workspace 'MyApp.xcworkspace' platform :ios, '5.0' xcodeproj 'Common.xcodeproj' pod 'AFNetworking', '1.1.0' pod 'TTTAttributedLabel', '1.6.0' pod 'JSONKit', '1.5pre' pod 'Reachability', '3.1.0' target 'MyApp' do xcodeproj 'MyApp.xcodeproj' # specific dependencies end 

这样,Common lib和MyApp就可以正确设置,以使用所有的依赖关系。 但是,这仍然会导致重复的符号。 解决方法是简单地从Common项目的Build阶段中删除libPods.a。 这很好,因为我们不是真的想链接到静态库的Cocoapods静态库。 所有正确的依赖项将在您构build应用程序时被链接,并且.xccconfig文件中将设置所有正确的标题path,以便Xcode / AppCode仍将提供所有自动完成,并且所有内容都将被编译。

每次运行pod install时都需要删除libPods.a,这有点痛苦,但是比手动pipe理所有依赖关系更好。

更新:我正在写这个,我刚刚注意到,不要在你的静态库中使用链接器标志Cocoapods。 默认情况下,我的静态库重写了它们的值,但没有任何值,但Cocoapods对此提出警告并build议您使用$(inheritance)。 只要忽略它。