私は現在、非常に大きなコードベースのための単一の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でも同じ問題が残っている。
ええ、あなたは問題について正しいです。 プロジェクトBとプロジェクトCをプロジェクトAにリンクしないだけで問題を解決しました。プロジェクトBとCは依然としてプロジェクトAを依存関係として参照しているため、うまく構築できます。クライアントは常にこれらのプロジェクトの横にプロジェクトAを含めているので、すべてのシンボルが見つかるだけで機能します。 – Jeff
@ジェフどのようにAを「依存関係」にして他の人がビルドできるようにしましたか? – johnbakers
@Rob Xcodeでは、別のライブラリのヘッダーのみを含むスタティックライブラリをビルドしても、他のライブラリのバイナリにリンクしていないと、ビルドは正常に完了しています。代わりに実際のプログラムプロジェクト(ライブラリではない)でこれを行うと、リンク段階で定義されていない定義(エラー)があります。私はあなたがライブラリを構築するとき、リンクステージのこの部分を「スキップ」するのは正常ですが、実際のプログラムはビルド時に余分なリンクチェックを行いますが、それは正しいと思いますか? (ライブラリをビルドするように指示されている場合、コンパイラが実際にやっていることでしょうか?) – johnbakers