2012-07-31 12 views
12

私は現在、非常に大きなコードベースのための単一のXcodeプロジェクトを持っています。プロジェクトXをサブプロジェクトの束に分割しています。プロジェクトA 、B、C)。別のスタティックライブラリを共有するスタティックライブラリをリンクする

これまでのところ、これらのプロジェクトはそれぞれ単独でコンパイルされています。それらはすべて静的ライブラリを生成します。 プロジェクトBおよびプロジェクトCは、建設するためにプロジェクトAによって生成された静的ライブラリに依存しています。

私はプロジェクトBとCによって生成静的ライブラリを必要とする別のXcodeプロジェクト、プロジェクトZを、持っています。ここに問題がある。 プロジェクトZは、リンカフェーズに入ると、物事は爆破 - 重複したシンボルは、彼らが最初にプロジェクト内にリンクされたコードのためプロジェクトBとCのためのLIBSの中に発見されました!

私は静的ライブラリの世界にかなり新たなんだ、と私はプロジェクトZで前方に移動する方法がわからないんだ、またはどのように彼らは同じプロジェクトAにリンクされているように、他のプロジェクトを変更するには lib。私はそれが不可能だと感じている。私の選択肢は何ですか?

編集:

私はいくつかのクライアントはどちらか一方だけが必要になりますので、プロジェクトBプロジェクトCが別々の静的LIBSに構築する必要があることを明確にすべきです。

また、私はOSXとiOSの両方のプラットフォームでこのジレンマを抱えています。

私は、プロジェクトを動的ライブラリとして構築することでOSX上でこの問題を解決できることを認識しました。しかし、私はこれをやりたくないと思うし、iOSでも同じ問題が残っている。

答えて

16

静的ライブラリには、他の静的ライブラリ(または一般的には第三者のコード)が含まれるべきではありません。静的ライブラリは、一緒に接着された.oファイルの束です。同じ情報を複数コピーしていると、それは爆発するでしょう。

各静的ライブラリには、独自のコードが含まれている必要があります。最終申請は、必要なすべての図書館(図書館が必要とする図書館を含む)を一緒にリンクする責任があります。この方法では、リンクされた各物の正確に1つのコピーがあります。

+1

ええ、あなたは問題について正しいです。 プロジェクトBとプロジェクトCをプロジェクトAにリンクしないだけで問題を解決しました。プロジェクトBとCは依然としてプロジェクトAを依存関係として参照しているため、うまく構築できます。クライアントは常にこれらのプロジェクトの横にプロジェクトAを含めているので、すべてのシンボルが見つかるだけで機能します。 – Jeff

+0

@ジェフどのようにAを「依存関係」にして他の人がビルドできるようにしましたか? – johnbakers

+1

@Rob Xcodeでは、別のライブラリのヘッダーのみを含むスタティックライブラリをビルドしても、他のライブラリのバイナリにリンクしていないと、ビルドは正常に完了しています。代わりに実際のプログラムプロジェクト(ライブラリではない)でこれを行うと、リンク段階で定義されていない定義(エラー)があります。私はあなたがライブラリを構築するとき、リンクステージのこの部分を「スキップ」するのは正常ですが、実際のプログラムはビルド時に余分なリンクチェックを行いますが、それは正しいと思いますか? (ライブラリをビルドするように指示されている場合、コンパイラが実際にやっていることでしょうか?) – johnbakers

2

これは解決するために作成されたCoacoaPodsという問題のようなものです。これらのプロジェクトごとにポッドを定義すると、Zは、重複するシンボルを導入することなく、すべての依存関係をチェーンの上に決定し、リンクすることができます。

関連する問題