26

ワークスペースを Cocoapods で正しくコンパイルするのに問題があります。ワークスペースには 3 つのプロジェクトがあり、それぞれに独自のターゲットがあります。

  1. libPods - すべての外部依存関係を持つ Cocoapods 静的ライブラリ
  2. libCommon - すべての共有コード (ベース コントローラー、ネットワーク コード、共通 UI など) を保持する静的ライブラリ
  3. myApp - 私の iOS アプリケーション

libCommon と myApp の両方に、libPods からの外部依存関係が必要です。当初は、次のように機能すると考えていました。

  1. libPods ビルド
  2. libPod およびビルドに対する libCommon リンク
  3. myApp は libCommon およびビルドとリンクします

このシナリオでは、libCommon がポッドを「所有」し、次に myApp は、以前の Cocoapod で常に行ってきたように、libCommon に対してリンクするだけです...動的ライブラリ エラー)。代わりに libPods と libCommon をビルドし、次に myApp を両方のライブラリにリンクする必要があるという github の問題をどこかで読みました。現在、私のポッドファイルは次のようになっています。

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 ビルド設定でポッド ヘッダーへのパスを指定します。これは、libCommon のクラスの 1 つを使用しようとするまでは正常にビルドされます。これを行うと、これらの_OBJC_CLASS_$_Blahエラーの 1 つが表示されます (ヘッダーは利用可能ですが、まだ適切にリンクされていないことがわかります)。「ビルド フェーズ」で libCommon を手動でリンクしようとすると、重複シンボル エラーが大量に発生します (既にリンクされていると思い込んでしまいます)。一体何?

これを適切に行う方法と、ポッドファイルはどのように見えるべきですか?

4

2 に答える 2

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 が正しくセットアップされ、すべての依存関係が使用されます。ただし、これでもシンボルの重複が発生します。これを回避するには、共通プロジェクトのビルド フェーズから libPods.a を削除するだけです。とにかく、Cocoapods 静的ライブラリを静的ライブラリにリンクしたくないので、これで問題ありません。アプリをビルドすると、すべての正しい依存関係がリンクされ、すべての正しいヘッダー パスが .xccconfig ファイルに設定されるため、Xcode/AppCode は引き続きすべてのオートコンプリートを提供し、すべてがコンパイルされます。

実行するたびに libPods.a を削除する必要がありますがpod install、これは少し面倒ですが、すべての依存関係を手動で管理するよりも、そのほうがよいかもしれません。

更新:私は執筆中にこれに取り組んでいますが、スタティック ライブラリ内でセットアップされたリンカー フラグ Cocoapods を使用しないことが重要であることに気付きました。デフォルトでは、静的ライブラリはその値を値なしでオーバーライドしていましたが、Cocoapods はこれに対して警告し、$(inherited) を使用することをお勧めします。無視してください。

于 2013-07-25T22:09:43.537 に答える