26

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

  1. libPods - 具有所有外部依赖项的 Cocoapods 静态库
  2. libCommon - 我的静态库,用于保存所有共享代码(基本控制器、网络代码、通用 UI 等)
  3. myApp - 我的 iOS 应用程序

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

  1. libPods 构建
  2. 针对 libPods 和构建的 libCommon 链接
  3. myApp 与 libCommon 链接并构建

在这种情况下,libCommon “拥有” pod,然后 myApp 只是链接 libCommon,就像我一直在做 pre-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错误(它告诉我虽然标题可用,但它仍然没有正确链接)。当我尝试在“构建阶段”中手动链接 libCommon 时,我得到一堆重复的符号错误(这让我相信它已经链接了?)。有没有搞错?

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

4

2 回答 2

11

CocoaPods 创建一个隐式根目标,默认情况下它与项目的第一个目标链接。当您正在创建另一个目标并且链接_with 选项不被子目标定义继承时,您的设置不起作用。为了制作 link_with 选项,您可以将其移动到 MyApp 目标定义的块内。

由于 Common 目标与 Pod 链接,如果您将它们与 MyApp 链接,则会导致应用程序与 Common 链接时出现重复符号错误。在这种情况下,您只需使标头可用于 MyApp 目标。这很容易做到,但还没有合适的 DSL,所以目前作为一种解决方案有点 hacky(但受支持)。

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
于 2013-05-09T23:01:22.437 回答
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 仍将提供您所有的自动完成功能并且一切都会编译。

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

更新:我正在写这个,我刚刚注意到不要使用在静态库中设置的链接器标志 Cocoapods 很重要。默认情况下,我的静态库已经用没有值覆盖了它们的值,但 Cocoapods 对此发出警告并建议您使用 $(inherited)。忽略它。

于 2013-07-25T22:09:43.537 回答