web-dev-qa-db-ja.com

Xcodeワークスペース内のプロジェクト間の依存関係を管理するにはどうすればよいですか?

私はiOSアプリプロジェクトに取り組んでおり、json-frameworkプロジェクトをワークスペースに追加しています。左側のプロジェクトナビゲーターには両方のプロジェクトが表示され、ビルドスキームセレクターには両方のプロジェクトのスキームも表示されます。次に、json-frameworkプロジェクトのlibjson.aターゲットを、他のプロジェクトのiOSアプリターゲットへの依存関係として追加します。期待される結果は、アプリターゲットがビルドされるたびに、(必要に応じて)ライブラリターゲットをビルドし、それに対してアプリターゲットをリンクすることです。これを私が試みた方法は次のとおりです。

  • 同じスキームの一部として両方を構築します。私がこれを試す方法は、アプリのスキームを編集し、スキームの「ビルド」部分に「libjson.a」を追加し、「暗黙的な依存関係の検索」チェックボックスをオンにすることです。次に、アプリターゲットのターゲットエディターに移動し、「ビルドフェーズ」->「ライブラリとバイナリをリンク」で、ワークスペースライブラリのリストから「libjson.a」を選択します。その後、スキームをビルドしようとすると、ライブラリターゲットがビルドされますが、アプリターゲットのビルドは、リンカーエラー "Library not found for -ljson"で失敗します-ライブラリがビルドされたことを実際に発見していないことを示唆しています実際、プロジェクトナビゲーターでは、ライブラリのアプリプロジェクトの下のエントリはまだ赤で、ファイルが存在しないことを示しています。

  • Jsonターゲットを明示的な依存関係として追加します。これを試すために、ビルドスキームを変更せずに、アプリターゲットのターゲットエディターに移動し、[ターゲットの依存関係]の下にある追加ボタンをクリックします。ワークスペース内の他のプロジェクトのターゲットは表示されないため、これはスターターではありません。

  • JSONプロジェクトを他のプロジェクトにドラッグし、ターゲットを依存関係として追加します。これは、Xcode 3でしたことです。プロジェクトナビゲーターで、ライブラリプロジェクトを取得し、アプリプロジェクト上にドラッグします。これにより、通常の「ファイルの追加」ペインが表示されます。「完了」をクリックするだけで、このウィンドウは閉じられます。プロジェクトナビゲータには、ライブラリプロジェクトのtwoエントリがあります。1つはトップレベル、もう1つはアプリプロジェクトの下にあります。ターゲットエディターを使用してライブラリターゲットをアプリターゲットの依存関係として追加できるようになり、ライブラリのリンクフェーズでエラーなしでリンクできるようになりました。しかし、壊れているように見えます。ナビゲーターの同じプロジェクトに複数のエントリーがあります。これを行う別の方法はありますか?

同じワークスペース内の異なるプロジェクトでこれらのターゲットを接続する「Xcode 4-ish」の方法と見なすべきものは何ですか?同じワークスペース内の複数のプロジェクトが実際に相互にやり取りできない場合、欠けているように見えます。ありがとう、グラハム。

59
user23743

バージョン3で説明したように、新しいワークスペースを作成し、2つのXcodeプロジェクトをドラッグして、図のようにネストして、テストプロジェクトを設定しました。

兄弟プロジェクトが既にある場合は削除できます。

私が見る限り、これに基づいてビルドすると、うまくいきます。

Scheme SettingsProject Layout

2つのプロジェクトがある場合、内部パスの混乱があると思います。「表示」->「ユーティリティ」->「ファイルインスペクター」の場所の設定をいじり、どのような効果があるかを見てみたいと思います。

enter image description hereenter image description here

もう1つ試すことは、Xcodeの「設定…」->「ソースツリー」でパスを設定し、ここで説明するようにそのように参照することです。 簡単、iPhoneアプリ間でのモジュラーコード共有:静的ライブラリとクロス-プロジェクト参照

HTH。アンディ・W.

24
creednmd

ここで説明したように、ワークスペース内のプロジェクト間の依存関係を取得して動作しました: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode -4 /

残念ながら、Xcodeで暗黙的な依存関係を発見したり、ビルドのすべてをアドバタイズされたとおりにインデックス付けする方法を見つけることができません。私は両方の回避策を見つけましたが、Xcode 4が成熟するにつれて、より少ない手動設定が必要になることを望んでいます。

9
Jonah

私は同じ質問をするつもりで、自分の解決策は正しくないと考えました。しかし、私はそれがここで言及されているのを見ていません、そしてそれはうまくいくようです。明らかにXCode 4は進行中の作業です。 :)

静的ライブラリとライブラリを使用するアプリの2つのプロジェクトを含むワークスペースがあります。プロジェクトは兄弟です。各プロジェクトには独自のスキームがあり、各スキ​​ームは1つのターゲットのみをビルドするように設定されています。つまり、2つのプロジェクトをワークスペースに追加しました。

静的ライブラリをアプリの依存関係として追加するには、libsomething.a製品をライブラリプロジェクト(Project Navigator)からアプリターゲットの「Link Binary with Libraries」リストにドラッグします。それでおしまい。アプリをビルドすると、ライブラリプロジェクトが最初にビルドされてからリンクされます。興味深いことに、アプリのスキームを変更して別の構成(たとえば、デバッグではなくリリース)を使用すると、同じ構成を使用してライブラリが構築されます。

それで動作し、ここでいくつかの自動依存性チェックが明らかに行われています。しかし、それは間違っているように感じます。それから、モーダルスキームエディター/マネージャーとプロジェクトナビゲーターのワークスペースオブジェクトの欠如も同様です。

1
Tyler Daniel

これを行う私の防弾ソリューション:

../MyLibProject/build/Debug-iphoneosまたは../MyLibProject/build/Release-iphonesimulatorなどのいずれかを含めるために、メインプロジェクト(libではなく)のビルド設定で「デバッグリリースごと/アーキテクチャごと」設定を作成します。 ..
構成に応じて([デバッグ]または[リリース]の横にある[+]をクリックし、[任意のiOSシミュレータSDK]または[任意のiOS SDK]を選択することにより、これらの構成を作成できます。 「ヘッダー検索パス」(ライブラリがいくつかのヘッダーファイルをコピーする場合、これは可能性が高い)AND「ライブラリ検索パス」の場合。つまり、各設定で、おそらく4つの異なるパスになります(デバッグsim 、iosのデバッグ、simのリリース、iosのリリース)。これにより、両方のプロジェクトの構成が一致することが確認されます。

ここで、libを自動コンパイルする、つまり依存関係を作成するために、上記の「ビルドフェーズ->ライブラリとバイナリへのリンク-> +-> .aファイルを選択する」というアドバイスを使用できます。

それが、Xcode 4.5のすべての環境で正しくビルドおよびリンクできるものを管理する唯一の方法です

注:「他のリンカーフラグ」に-lmyLibフラグを追加しましたが、それが本当に必要かどうかわかりません

1
Ben G

Xcodeワークスペース

workspaceは、プロジェクトと他のドキュメントをグループ化して一緒に作業できるXcodeドキュメントです。ワークスペースには、任意の数のXcodeプロジェクトと、含める他のファイルを含めることができます。ワークスペースは、各Xcodeプロジェクトのすべてのファイルを整理することに加えて、含まれるプロジェクトとそのターゲット間の暗黙的および明示的な関係を提供します。

ワークスペースはワークフローの範囲を拡張します

プロジェクトファイルには、プロジェクト内のすべてのファイルへのポインターと、ビルド構成およびその他のプロジェクト情報が含まれています。 Xcode 3以前では、プロジェクトファイルは常にグループおよびファイル構造階層のルートです。プロジェクトには他のプロジェクトへの参照を含めることができますが、Xcode 3で相互に関連するプロジェクトの作業は複雑です。ほとんどのワークフローは単一のプロジェクトに限定されています。 Xcode 4以降では、1つ以上のプロジェクトに加えて、含める他のファイルを保持するワークスペースを作成するオプションがあります。

ワークスペース内のプロジェクトはビルドディレクトリを共有します

デフォルトでは、ワークスペース内のすべてのXcodeプロジェクトは、ワークスペースビルドディレクトリと呼ばれる同じディレクトリにビルドされます。各ワークスペースには、独自のビルドディレクトリがあります。ワークスペース内のすべてのプロジェクトのすべてのファイルは同じビルドディレクトリにあるため、これらのファイルはすべて各プロジェクトに表示されます。したがって、2つ以上のプロジェクトが同じライブラリを使用する場合、それらを各プロジェクトフォルダーに個別にコピーする必要はありません。

Xcodeはビルドディレクトリ内のファイルを調べて、暗黙的な依存関係を発見します。たとえば、ワークスペースに含まれる1つのプロジェクトが、同じワークスペース内の別のプロジェクトによってリンクされるライブラリをビルドする場合、ビルド設定によりこの依存関係が明示的になっていなくても、Xcodeは他のプロジェクトをビルドする前にライブラリを自動的にビルドします。必要に応じて、このような暗黙的な依存関係を明示的なビルド設定でオーバーライドできます。明示的な依存関係の場合、プロジェクト参照を作成する必要があります。

ワークスペース内の各プロジェクトには、独自の独立したIDが引き続きあります。ワークスペース内の他のプロジェクトに影響を与えずに(または影響を受けずに)プロジェクトで作業するには、ワークスペースを開かずにプロジェクトを開くか、プロジェクトを別のワークスペースに追加します。プロジェクトは複数のワークスペースに属することができるため、プロジェクトやワークスペースを再構成することなく、任意の数の組み合わせでプロジェクトに取り組むことができます。

XCode 4では、ワークスペースの概念がXCode 3sの機能に取って代わると考えられていますcross-project references[約] 続きを読む こちら

0
yoAlex5

フレームワークのような静的ライブラリ の作成にある程度成功しましたが、完璧なソリューションではありません。

0
amrox