使用现有静态库和iOS应用程序配置Cocoapods

时间:2013-05-08 23:01:49

标签: ios xcode static-libraries cocoapods

我无法使用Cocoapods正确编译我的工作区。工作区中有3个项目,每个项目都有自己的目标:

  1. libPods - 包含所有外部依赖关系的Cocoapods静态库
  2. libCommon - 我的静态库,我保存所有共享代码(基本控制器,网络代码,常用UI等)
  3. myApp - 我的iOS应用程序
  4. libCommon和myApp都需要libPods的外部依赖项。最初我认为它会像这样工作:

    1. libPods build
    2. libCommon链接libPods和build
    3. myApp链接libCommon并构建
    4. 在这种情况下,libCommon“拥有”pod,然后myApp只链接libCommon,就像我一直在做Cocoapods之前...但显然静态库不喜欢与静态库链接(我得到了一堆动态库错误)。我在某个地方阅读github问题,而不是我应该构建libPods和libCommon,然后myApp应该链接到两个库。现在我的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拥有所有pod,然后在libCommon构建设置中指定pod标头的路径。这构建正常,直到我尝试使用libCommon中的一个类。一旦我这样做,我得到其中一个_OBJC_CLASS_$_Blah错误(告诉我虽然标题可用,但它仍然没有正确链接)。当我尝试在“Build Phases”中手动链接libCommon时,我得到了一堆重复的符号错误(让我相信它已经链接了?)。到底是什么?

      正确执行此操作的方法是什么?我的podfile应该是什么样的?

2 个答案:

答案 0 :(得分:11)

CocoaPods创建一个隐式根目标,默认情况下链接到项目的第一个目标。当您创建另一个目标并且子目标定义未继承link_with选项时,您的设置无效。为了生成link_with选项,您可以将其移动到MyApp目标定义的块中。

当Common目标与Pod链接时,如果您将其与MyApp链接,则当应用程序与Common链接时,将导致重复符号错误。在这种情况下,您只需要将标头提供给MyApp目标即可。这很简单,但目前没有合适的DSL,所以暂时作为解决方案有点笨拙(但支持)。

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

答案 1 :(得分:5)

我采用的解决方案如下:

我很简单地设置了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 Phase中删除libPods.a。这很好,因为我们真的不想将Cocoapods静态库链接到我们的静态库。构建应用程序时将链接所有正确的依赖项,并在.xccconfig文件中设置所有正确的标头路径,因此Xcode / AppCode仍将提供所有自动完成功能,所有内容都将编译。

每次运行pod install时都需要删除libPods.a这有点痛苦,但与手动管理所有依赖项相比,这可能会更好。

更新:我正在写这篇文章,我刚刚注意到不要在静态库中使用Linker Flags Cocoapods设置。默认情况下,我的静态库已经覆盖了它们没有值的值,但是Cocoapods警告不要这样做,并建议你使用$(继承)。只是忽略它。