web-dev-qa-db-ja.com

必要なときに依存関係を構築するようにXcode 4ワークスペースを構成する正しい方法は何ですか?

私の場合はシンプルで、2つの兄弟プロジェクトを持つワークスペースです。1つのメイン(iOS)アプリと、アプリで使用されるいくつかの静的ライブラリターゲットをビルドするプロジェクトです。

ビルドの構成方法は次のとおりです。

  • メインアプリのビルド設定の「ユーザーヘッダー検索パス」がライブラリプロジェクトの場所を指している(ソースツリー経由)
  • アプリのメインターゲットのエディター->ビルドフェーズ->「ライブラリとバイナリをリンク」セクションで、使用するライブラリ製品を追加しました。
  • スキームでは、「暗黙的な依存関係の検索」にチェックマークが付いています。

クリーン(および派生データの削除)の後、メインプロジェクトのビルド中にビルドによりこのエラーが発生します。

ld: library not found for -lChipmunk
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang failed with exit code 1

案の定、新しく作成した派生データを見ると、検出されるオブジェクトファイルはライブラリではなくメインアプリのみです。 * .oファイルの広範な「検索」では、関連するものは何も明らかにされないため、ライブラリは失われず、ビルドされていません。

補足事項:

  • Apple devフォーラムでこれについて尋ねたとき、メインターゲットの[ビルドフェーズ]-> [ターゲットの依存関係]エディターで明示的な依存関係を追加することをお勧めします。 sameプロジェクトまたはサブプロジェクトのターゲットに、私の場合、職場の兄弟としてアプリとライブラリプロジェクトがあります。
  • メインビルドの前に各ライブラリを手動でビルドすれば、すべて問題ありません。

更新:

回避策を見つけました。これは、すべての依存関係のターゲットをメインアプリのスキームの「ビルド」部分に追加することです。以前はこれを試してみましたが成功しませんでしたが、リスト内のターゲットをドラッグして正しいビルド順序を取得できることに気付いていませんでした。ビルドは、クリーンアップ後と、ライブラリまたはメインアプリソースのいずれかの変更後の両方で、正しい順序で行われるようになりました。

ここで質問を残しています。ビルドの順序を手動で整理する必要はないはずだからです。私が物事をどのようにセットアップするかについては、何か間違っている必要があります。

36
Cris

スキームの編集(ビルドターゲットの入れ替え、「ビルドの並列化」および/または「暗黙的な依存関係の検索」のチェックを外す)が機能しませんでした。静的ライブラリでコードを変更した後、プロジェクトをクリーンビルドする必要がありました。開発者フォーラムを検索して、最終的に この回答 が見つかりました。

Identity and Typeインスペクターが表示されていることを確認し、アプリケーションのプロジェクト(ライブラリではなく)のlibWhatever.aファイルを選択します。 [場所:プロジェクトに相対的](または[グループに相対的])が表示される場合、これが問題です。

  1. [プロジェクトに相対的]をクリックし、[ビルド製品に相対的]に変更します。
  2. これはリンクのタイプを変更しますが、それでも壊れます。
  3. 検索ボタンをクリックして、出力ファイルを見つけます。

Build Phases->Link Binary with Librariesを介して既存のプロジェクトに静的ライブラリを追加すると、自動的に「Relative to Group」(両方が同じワークスペースの兄弟である場合)。上記の方法で場所を変更すると、ビルドの依存関係の問題が解決され、プロジェクトナビゲーターで.aファイルが(赤ではなく)黒文字で表示されます。

41
christoph

ワークスペースで複数のプロジェクトを設定する方法をここで説明しました: http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode -4 /

Xcodeのドキュメントに基づいて、スキーム内のビルドターゲットの順序を手動で調整する必要はないことに同意しますが、これがこれまでに見つけた最良のソリューションです。


編集:可能な限り、この時点で https://github.com/CocoaPods/CocoaPods を使用してプロジェクトの依存関係を管理することをお勧めします。

8
Jonah

ライブラリプロジェクトをメインプロジェクトにドラッグしてみてください。

library project reference inside main project

2
Jeffy

私の場合、兄弟設定をビルドできる唯一の方法は、ビルド設定->ライブラリ検索パスに手動でパス「../MyLibProject/build/Debug-iphoneos」を追加することです(確認のために再帰的にチェックします)。メインプロジェクトだけに.aファイルを追加しても、リンク時に「libが見つかりません」というエラーを防ぐことはできませんでした。

0
Ben G