2013-06-13 2 views
15

cocoapodsと静的ライブラリを構築します。私は、依存関係を最終的な静的ライブラリ(libMyProject.aを呼び出す)に含めたくないので、それらとリンクして、同じ依存関係を置くことができるMyProject.Podspecファイルを作成したいだけです。私はPodfileに指定された別の依存関係を(例えばAFNetworking)は、静的ライブラリを構築しようとしています

問題は、libMyProject.aをビルドすると、libPods.aがリンクされて含まれているため、libMyProject.aを配布して他の人が同じ依存関係の一部を使用するプロジェクトに統合すると、重複してしまうシンボルの問題。

にはどうすればlibPods.a libににリンクけどlibMyProject.aに含めることはできませんか?他の既存のフレームワークとリンクするのと同じように動作するはずです。

ありがとうございます!

+0

以下に追加した回答が正しい場合は、それを「いいえ」とマークして、この質問が開いていると表示されなくなります。 – memmons

答えて

12

私はビルドフェーズにおけるセクション「リンクのバイナリとライブラリ」からlibPods.a libにを削除することによってそれを解決しました。手動でビルドフェーズ「ライブラリとリンクバイナリ」からlibPods.aを削除しながら

+0

これは正解だと思うし、ここで私の解決策を詳しく述べる:http://stackoverflow.com/a/17869668/106703 –

+4

この削除を自動化するいくつかのスマートな方法はありますか?私は成功していない複数のアプローチを試みました。 – Wilmar

+0

@Wilmar、私の答えを自動削除(または具体的には、最初に追加しないようにする方法)を参照してください。 –

6

が実際に作業を行い、本当の答えは、それが最初の場所でそこに追加されますさせないことです。

ポッドinstallコマンドをするので、それが追加された理由があるのとリンクするその目標の一つとして、静的ライブラリのターゲットを見つけることです。ターゲットが明示的に指定されていない場合は、最初のターゲットを選択します)、または 'link_with'セクションに明示的に指定している可能性があります。

回答は、Podfileのlink_withセクションを使用してターゲットを明示的に指定することです。はスタティックライブラリターゲットを省略しています。

ポッドプロジェクトがまだ作成され、あなたの依存関係は、あなたが期待するとしてそこに持ち込まが、libPods.aはあなたの静的ライブラリのビルドフェーズに追加されません。

唯一の問題は、静的ライブラリでない場合、link_withセクションに何を入れるかということです。あなたがリンクしたい他のターゲット(例えば、iPhoneアプリのターゲット)があれば、それは良い選択です。しかし、あなたの唯一の本当のターゲットがあなたの静的ライブラリなら、少しの回避策が必要です。

これまでのところ、静的ライブラリターゲット(つまり、メインライブラリとは別の静的ライブラリターゲット)を作成し、それを「ダミー」と呼びました。あなたのPodfileのlink_withセクションでこのターゲットを指定してください。

少し嫌なことはありますが、それは効いています。

platform :ios, '5.1.1' 

link_with ['Dummy'] 

pod 'AFNetworking', '= 1.3.1' 
+1

これはうまくいきますが、静的ライブラリターゲットの設定を 'Pods.xcconfig'に設定する必要があります。そうしないと、静的ライブラリで依存ライブラリのヘッダを使用できなくなります。 – murat

+0

Podfileの例を共有できますか?これは私のためには機能しません。 – pshah

+0

投稿を更新して、podfileの完全な例を追加しました。 –

1

参照されるライブラリは、静的ライブラリ製品に(デフォルトでは)含まれていません。表示されているリンカーの競合は、静的ライブラリとクライアントアプリケーションの両方がデフォルト(暗黙的)Podターゲットを使用している可能性が高くなります。

すべてのCocoapodsで生成されたターゲットには、製品にコンパイルされた "Pods-target -dummy.m"ファイルが含まれています。デフォルトのPodsターゲットを使用する場合は、単に「Pods-dummy.m」と呼ばれます。ライブラリとクライアントの両方がデフォルトターゲットを使用する場合、ダミーファイルをコンパイルして生成された同じシンボルがリンクエラーを引き起こします。

私はCraig's answerのバリエーションを試しましたが、link_withステートメントは、ヘッダー検索パスを制御するコンパイラフラグを提供するCocoapodsで生成されたxcconfigの接続も担当しています。もちろん、手動でxcconfig(またはヘッダー検索パスのプロジェクト設定)を追加することもできますが、私はチームのために繰り返し可能なソリューションを探していました。

私のソリューションは、(例えば、ライブラリーの名前)クライアントプロジェクトで競合が発生することはほとんどありません名前で、ライブラリーのための明確な目標を作成することです:

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

あなたは含めることができますlink_withステートメントtargetブロック内のスタティックライブラリターゲットの名前(Xcodeプロジェクト内の名前)が異なる場合でもターゲットが1つしかない場合、通常は両方とも同じ名前を使用して、link_withを不要にします。

ユニットテストターゲットをお持ちの場合は、2つの別個のターゲットを作成してください。 (私は現在def両方のターゲットで使用される一般的なポッドのセット、抽象的目標は、現在のオプションはありませんが、1日になるかもしれないので)それは次のようになります。

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-ターゲット -dummy.m」という名前が付けられます。これらのオブジェクトファイルがリンクされている場合、競合は発生しません。

+0

ちょっと、[eliasbagley投稿]が見つかりました/ a/23370841/686385)既に同じソリューション! –