Xcode 4は静的ライブラリの依存関係からパブリックヘッダーファイルを見つけることができません


91

検索に役立つ代替タイトル

  • Xcodeがヘッダーを見つけられない
  • Xcodeに.hがありません
  • Xcode .hファイルが見つかりません
  • 字句またはプリプロセッサの問題ファイルが見つかりません

Xcode 3からのiOSアプリケーションプロジェクトに取り組んでいます。Xcode4に移動しました。プロジェクトは多数の静的ライブラリをビルドします。

これらの静的ライブラリはパブリックヘッダーも宣言し、それらのヘッダーはアプリケーションコードで使用されます。Xcode 3.xでは、ヘッダーは(ビルドフェーズとして)にコピーさpublic headers directoryれ、アプリケーションプロジェクトではpublic headers directoryに追加されましたheaders search list

Xcode 4では、ビルドディレクトリはに移動され~/Library/Developer/Xcode/DerivedData/my-projectます。

問題は、ヘッダーの検索設定でこの新しい場所をどのように参照するかです。のようだ:

  • public headers directory に関連しています DerivedDataディレクトリをいますが、
  • headers search ディレクトリは他のもの(おそらくプロジェクトの場所)を基準にしています

依存関係としてコンパイルしようとするときに、静的ライブラリを使用するクライアントがヘッダーファイルを利用できるようにするために、Xcode 4でiOS開発用の静的ライブラリターゲットをどのように設定すればよいですか?


パス名に関連している可能性があります。Plはこの投稿をチェックします。[Xcodeの4における静的ライブラリ] [1] [1]:stackoverflow.com/questions/6074576/static-libraries-in-xcode-4/...
ディエゴMarafetti

回答:


124

この問題に対して私が見たそれぞれの解決策は、洗練されていないように見える(アプリケーションのプロジェクトにヘッダーをコピーする)か、非常に単純化されており、些細な状況でのみ機能するようになっています。

短い答え

次のパスをユーザーヘッダー検索パスに追加します

「$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts」

なぜこれが機能するのですか?

まず、問題を理解する必要があります。通常の状況、つまり、実行、テスト、プロファイル、または分析を行うときに、Xcodeはプロジェクトをビルドし、$ BUILT_PRODUCTS_DIRマクロを介して利用可能なBuild / Products / Configuration / Productsディレクトリに出力を配置します。

静的ライブラリに関するほとんどのガイドでは、パブリックヘッダーフォルダーパス$ TARGET_NAMEに設定することを推奨しています。つまり、libファイルは$ BUILT_PRODUCTS_DIR /libTargetName.aになり、ヘッダーは$ BUILT_PRODUCTS_DIR / TargetNameに配置されます。アプリに$ BUILT_PRODUCTS_DIRが含まれている限り検索パスにが、インポートは上記の4つの状況で機能します。ただし、アーカイブしようとすると、これは機能しません。

アーカイブの動作は少し異なります

プロジェクトをアーカイブすると、XcodeはArchiveIntermediatesと呼ばれる別のフォルダーを使用します。そのフォルダー内に/ YourAppName / BuildProductsPath / Release-iphoneos /があります。これは、アーカイブを実行するときに$ BUILT_PRODUCTS_DIRが指すフォルダーです。そこを見ると、ビルドされた静的ライブラリファイルへのシンボリックリンクがありますが、ヘッダーのあるフォルダーがありません。

ヘッダー(およびlibファイル)を見つけるには、IntermediateBuildFilesPath / UninstalledProducts /に移動する必要があります。静的ライブラリの場合、スキップインストールをYES に設定するように言われたときのことを覚えていますか?まあこれはあなたがアーカイブを作成するときに設定が持っている効果です。

補足:インストールをスキップするように設定しない場合、ヘッダーはさらに別の場所に配置され、libファイルはアーカイブにコピーされるため、App Storeに送信できる.ipaファイルをエクスポートできません。

何度も検索した後、UninstalledProductsフォルダーに対応するマクロを正確に見つけることができなかったため、「$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts」でパスを作成する必要があります。

概要

静的ライブラリの場合は、インストールをスキップし、公開ヘッダーが$ TARGET_NAMEに配置されていることを確認してください。

アプリの場合、ユーザーヘッダー検索パスを「$(BUILT_PRODUCTS_DIR)」に設定します。これは通常のビルドでは正常に機能し、「$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts」はアーカイブビルドで機能します。


これはDerivedDataフォルダーとどのように関係していますか?
Richard Stelling

通常のビルドは、DerivedData / WorkspaceName-hash / Build / Products / Debug-iphoneos / TargetName.appに移動します---ビルドのアーカイブは、DerivedData / WorkspaceName-hash / Build / Intermediates / ArchiveIntermediates / TargetName / BuildProductsPath / Release-iphoneos /に移動しますTargetName.app
Colin

3
私にとっては、「$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts」を再帰的なチェックボックスとともに使用しても機能しませんでした。再帰フラグなしで "$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts / <nameOfStaticLibrary>"を使用するとすぐに、うまくいきました。
TPoschel 2012

7
$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProductsは実際にはであることに注意してください$(TARGET_BUILD_DIR)。アーカイブ中も。;)
Pascal

1
Xcode 5の私にとって:$(BUILD_ROOT)/../ IntermediateBuildFilesPath / UninstalledProducts / include / NAME OF LIBRARY YESに設定していません:常にユーザーパスを検索します。
xarly 2014年

84

私は自分の静的ライブラリを開発するときにこの同じ問題に遭遇し、Colinの答えは非常に役に立ちましたが、ワークスペースを使用してXcode 4でプロジェクトを実行およびアーカイブするときに一貫して簡単に機能するように少し修正する必要がありました。

私の方法の違いは、すべてのビルド構成に単一のユーザーヘッダーパスを使用できることです。

私の方法は次のとおりです:

ワークスペースを作成する

  1. Xcode 4で、[ファイル]、[新規]、[ワークスペース]の順に移動します。
  2. 次に、Finderから、使用する静的ライブラリと、ライブラリを使用するビルド中の新しいアプリの両方の.xcodeprojプロジェクトをドラッグできます。ワークスペースの設定の詳細については、Apple Docsを参照してください:https : //developer.apple.com/library/content/featuredarticles/XcodeConcepts/Concept-Workspace.html

静的ライブラリプロジェクト設定

  1. すべての静的ライブラリのヘッダーが「パブリック」にコピーするように設定されていることを確認してください。これは、静的ライブラリターゲット>ビルドフェーズの設定で行われます。「ヘッダーのコピー」フェーズで、すべてのヘッダーが「公開」セクション内にあることを確認します。
  2. 次に、ビルド設定に移動し、「パブリックヘッダーフォルダーのパス」を見つけて、ライブラリのパスを入力します。私はこれを使用することを選択します:

include / LibraryName

私はこれをRestKitでの使用から採用し、すべての静的ライブラリで最適に動作することを発見しました。これにより、手順1で「パブリック」ヘッダーセクションに移動したすべてのヘッダーを、ビルド時に派生データフォルダー内にあるここで指定したフォルダーにコピーするようにXcodeに指示します。RestKitと同様に、プロジェクトで使用している各静的ライブラリを含めるために単一の「include」フォルダーを使用するのが好きです。

ここでマクロを使用することも好きではありません。これにより、後でスタティックライブラリを使用してプロジェクトを構成するときに、単一のユーザーヘッダー検索パスを使用できるようになります。

  1. 「インストールのスキップ」を見つけ、これがYESに設定されていることを確認します。

静的ライブラリを使用したプロジェクトの設定

  1. [ビルドフェーズ]> [ライブラリとバイナリをリンク]で静的ライブラリをフレームワークとして追加し、使用する静的ライブラリのlibLibraryName.aファイルを追加します。
  2. 次に、プロジェクトがユーザー検索パスを検索するように設定されていることを確認します。これは、[ビルド設定]> [常にユーザーパスを検索]で行い、必ず[はい]に設定してください。
  3. 同じエリアでユーザーヘッダーの検索パスを見つけて追加します。

    「$(PROJECT_TEMP_DIR)/../ UninstalledProducts / include」

これは、ビルドプロセス中にXcodeが作成する中間ビルドフォルダー内の静的ライブラリを探すようにXcodeに指示します。ここには、静的ライブラリプロジェクト設定用に手順2で設定した静的ライブラリの場所に使用している「include」フォルダーがあります。これは、Xcodeで静的ライブラリを正しく検出するための最も重要なステップです。

ワークスペースを構成する

ここでは、アプリをビルドするときに静的ライブラリがビルドされるようにワークスペースを構成します。これは、アプリで使用されているスキームを編集することによって行われます。

  1. アプリケーションを作成するスキームが選択されていることを確認してください。
  2. スキームのドロップダウンから、[スキームの編集]を選択します。
  3. 左側のリストの上部にある[ビルド]を選択します。中央のペインで+を押して、新しいターゲットを追加します。
  4. リンクしようとしているライブラリの静的ライブラリが表示されるはずです。iOS静的ライブラリを選択します。
  5. [実行]と[アーカイブ]の両方をクリックします。これは、アプリをビルドするたびに、静的ライブラリのライブラリをコンパイルするようにスキーマに指示します。
  6. 静的ライブラリをアプリケーションターゲットの上にドラッグします。これにより、スタティックライブラリがアプリケーションターゲットの前にコンパイルされます。

ライブラリの使用を開始する

これで、次のコマンドを使用して静的ライブラリをインポートできるはずです。

import <LibraryName/LibraryName.h>

この方法では、構成ごとに異なるユーザーヘッダーパスを用意する手間が省けるため、アーカイブのコンパイルに問題はありません。

なぜこれが機能するのですか?

それはすべてこのパスに依存します:

"$(PROJECT_TEMP_DIR)/../UninstalledProducts/include"

「Skip Install」を使用するようにスタティックライブラリを設定しているため、コンパイルされたファイルは一時ビルドディレクトリ内の「UninstalledProjects」フォルダに移動さ​​れます。ここでのパスは、静的ライブラリ用にセットアップし、ユーザーヘッダーの検索パスに使用する「include」フォルダーにも解決されます。2つが連携することで、コンパイルプロセス中にライブラリがどこにあるかをXcodeに知らせることができます。この一時ビルドディレクトリはデバッグ構成とリリース構成の両方に存在するため、静的ライブラリを検索するためのXcodeの単一パスのみが必要です。


3
あなたは素晴らしい人です!これは非常に役に立ち、説明したとおりに機能します。
neevek

1
驚くばかり。花はどこに送ればいいですか:)
Ramesh

1
これを設定した後、「...]認識されないセレクターがクラス0x ...に送信される可能性があります。もしそうなら、これをプロジェクトのターゲット->プロジェクト->ビルド設定
MkVal

スペースがある場合は、ユーザーヘッダーの検索パスが引用符で囲まれていることを確認してください。
RespectTheCode

Xcode 4.6.2は "$(PROJECT_TEMP_DIR)/../ UninstalledProducts / include"に何も書き込みません。私が見逃しているものはありますか?または、Xcodeの動作が再び変更されましたか?
2013年

16

Xcode 4プロジェクトが静的ライブラリのコンパイルに失敗する

関連質問:Xcode 4の「字句またはプリプロセッサの問題ファイルが見つかりません」

エラーには次のものがあります。ヘッダーファイルがない、「字句またはプリプロセッサの問題」

ソリューション:

  1. 「ユーザーヘッダーパス」が正しいことを確認します
  2. [常にユーザーパスを検索する]をYESに設定します
  3. 、プロジェクト内の「ヘッダの索引付け」グループ通話を作成し、このグループにヘッダをドラッグしないでくださいプロンプトが表示されたら、任意のターゲットに追加します。

11
見過ごされがちですが、非常に重要なもう1つのステップ:検索パスを二重引用符で囲んで、スペースをエスケープするようにします。いつも忘れてます。
ブラッド

@Bradに感謝します。これは確かに非常に重要で役立つコメントです。
ジュリアンD.

15

これは非常に役立つスレッドでした。私自身の状況を調査したところ、Appleには2012年9月付けの「iOSでの静的ライブラリの使用」というタイトルの12ページのドキュメントがあることがわかりました。ここにpdfリンクがあります:http : //developer.apple.com/library/ios/technotes/iOSStaticLibraries/iOSStaticLibraries.pdf

これは、ほとんどのインターネットディスカッションよりもはるかに単純であり、使用している外部ライブラリの構成方法を説明するいくつかの小さなMODがあるため、うまく機能しています。最も重要な部分はおそらく:

ライブラリターゲットに「ヘッダーのコピー」ビルドフェーズがある場合は、それを削除する必要があります。Xcodeで「アーカイブ」アクションを実行すると、ヘッダーのコピービルドフェーズが静的ライブラリターゲットで正しく機能しません。

Xcode 4.4以降で作成された新しい静的ライブラリターゲットには、ヘッダー用に適切に構成されたファイルのコピーフェーズが付属しているため、作成する前にすでにあるかどうかを確認する必要があります。そうでない場合は、ターゲットエディターの下部にある[ビルドフェーズの追加]を押して、[コピーファイルの追加]を選択します。新しいファイルコピービルドフェーズを開示し、宛先を「製品ディレクトリ」に設定します。サブパスをinclude / $ {PRODUCT_NAME}に設定します。これにより、ライブラリー(PRODUCT_NAMEビルド​​設定から取得)の名前が付けられたフォルダーに、ビルドされた製品ディレクトリー内のincludeというフォルダー内のファイルがコピーされます。ビルド製品ディレクトリ内のインクルードフォルダーは、アプリケーションのデフォルトのヘッダー検索パスにあるため、ヘッダーファイルを置くのに適切な場所です。

既存の多くの状況では、Appleのアプローチでは不十分な場合があります。静的ライブラリーの庭の道をたどり始めたばかりの人のために、これをここに投稿します。これは、単純なケースの最良の出発点になるかもしれません。


上記のリンクをたどる人のために..注意:ライブラリプロジェクトを作成するときにダミーテンプレートファイルを削除するように要求するステップ.. * .pchファイルは削除しないでください。アドバイスはカテゴリでは機能しません。ただし、修正はあります(どこかで見ました)
1

静的ライブラリを構築するためのAppleの公式アプローチへのリンクを提供してくれてありがとう。私はこのアプローチを使用して静的ライブラリを構築することから始めましたが、アーカイブできませんでした。@abbood-生成されたpchファイルの削除に関する問題は何ですか?
augusto callejas 2013

.pchファイルを削除した場合、プロジェクトはコンパイルされません(アーカイブなどの目的で)
。–

それは私にとっては機能しません。 ""を指定してimportステートメントを実行しようとすると機能しません<>が必要です。また、アーカイブしている間はヘッダーを見つけることができません。
user1010819 14

4

http://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html

Appleのドキュメントごと:

ライブラリには、そのライブラリのクライアントがインポートする必要がある1つ以上のヘッダーファイルがあります。クライアントにエクスポートするヘッダーを構成するには、ライブラリプロジェクトを選択してプロジェクトエディターを開き、ライブラリターゲットを選択してターゲットエディターを開き、ビルドフェーズタブを選択します。ライブラリターゲットに「ヘッダーのコピー」ビルドフェーズがある場合は、それを削除する必要があります。Xcodeで「アーカイブ」アクションを実行すると、ヘッダーのコピービルドフェーズが静的ライブラリターゲットで正しく機能しません。


3

洞察については、Jonah Wlliamのソリューション(真ん中下)とGitHubモデル(コメント)をご覧ください。 http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/


4
これは技術的に質問に答えることがありますが、リンクされた記事の本質的な部分を回答に含め、参照用のリンクを提供することをお勧めします。これを怠ると、リンクが腐敗する危険性があります。
jscs 2012

2

$(OBJROOT)/ UninstalledProducts / exactPathToHeadersヘッダー検索パスに追加します。

何らかの理由で再帰的なチェックボックスが機能しなかったため、残りのパスをヘッダーのある場所に追加する必要がありました。

Xcodeのログナビゲーター(ブレークポイントナビゲーターの右側にあるタブ)の下に、ビルド履歴が表示されます。実際のビルド失敗を選択した場合は、その詳細を展開してsetenv PATHを表示し、ヘッダーファイルへのパスが存在することを確認できます。


再帰的なチェックボックスに注意してください。同じ問題がここにあります。
Codezy、2012年

はい、特定のサブフォルダーも指定する必要があり、再帰的なチェックは機能しませんでした。
Oliver Pearmain 2014

ただし、このパスを使用することになりました(単に短いため) "$(PROJECT_TEMP_DIR)/../ UninstalledProducts / SubProjectHeaders"
Oliver Pearmain

2

私の場合、私のワークスペースにはいくつかの静的ライブラリプロジェクトがあり、そのうちの1つには、他のヘッダーファイルを含む依存関係があります。問題は建築の順番でした。[ビルド]セクションの[スキームの編集]ページで、並列化オプションの選択を解除し、依存関係に従ってターゲットの順序を調整し、問題によって解決しました


1

ユーザーヘッダーの検索パスに次のパスを追加します。

$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts

これは確認済みです!


1

私が馬鹿であるかを示すリスクがある...私はXCodeが午後中ずっと.hファイルを見つけるのを拒否することに悩まされてきました。

その後、私は実現しました。

「XCode 4」を使用していたため、「インテリジェント」に、すべてのプロジェクトを「XCode 4 projects」というフォルダーのサブフォルダーに置くことにしました。

フォルダ名のこれらのスペースは、XCodeをめちゃくちゃに混乱させました!

このフォルダの名前を " XCode_4_Projects "に変更すると、私の人生に喜び(そしてあまり罵倒が少なくなる)が戻ってきました。

再び私を思い出させる、どのような。今年は年ですか。

おそらく誰かがアップルの開発者に言うことができます...


1

これらの答えはどれもうまくいきませんでした。これが何をしたかです。以下を正確に(二重引用符を含めてコピーアンドペーストして)ユーザーヘッダー検索パスのビルド設定に追加します。

"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include/"

他の回答と比較して、「/ include /」サブディレクトリが追加されていることに注意してください。他のユーザーが指摘したように、「再帰的」オプションは何もしないようなので、無視してかまいません。

次の形式で静的ライブラリヘッダーファイルをインポートすると、プロジェクトが正常にアーカイブできるようになりました。

#import "LibraryName/HeaderFile.h"

静的ライブラリヘッダーに山かっこ()を含めない限り、[常にユーザーパスを検索する]設定を有効にする必要ありませが、システム/フレームワークヘッダーでない場合は、このようにしてはなりません。#import <LibraryName/HeaderFile.h>


1

Xcode 7では上記の答えはどれもうまくいきませんでしたが、良い考えが得られました。Xcode 7で苦労している人のために、ユーザーヘッダーの検索パス(引用符を含む)に以下を追加することでこれを修正しました

"$(BUILT_PRODUCTS_DIR)/usr/local/include"

usr/local/include静的ライブラリの「パブリックヘッダーフォルダーパス」設定の内容に従って相対URL部分を変更します


0

これは私にこの質問を引き起こした関連する問題なので、ドキュメントのために私のソリューションを厳密に追加します/それは発汗の別の魂の時間を節約する可能性があります

DropboxSDK.hファイルが見つかりません

iOS向けにVESをコンパイルしようとする日々の後に、私は最終的にこの問題に遭遇しました。これDropboxSDK.hは間違いなく手の届くところsearch headersにありました。framework headers検索パスに直接追加しinclude.h直接、さまざまな長さで試して取得しました。DropboxSDK.h

解決

明示的にドラッグDropboxSDK.frameworkのXcodeのにファイルProject Navigationとを確認してくださいCopy Files if neededチェックされを確認します。また、必要に応じてターゲットがチェックされていることを確認してください。

警告

で明示的なフレームワークの場所を設定してもbuild phasesうまくいきませんでした。ドラッグしなければならなかった.frameworkをXcodeて、ファイルがプロジェクトにコピーされていることを確認する必要がありました。

#mbp2015#xcode7#ios9


0

これを行うにはさまざまな複雑な方法があり、いくつかの非常にスマートなソリューションがこのスレッドで提案されています。

これらすべてのソリューションの主な問題は、ライブラリの移植性が大幅に低下することです。

  • ライブラリを使用して新しいプロジェクトを開始し、それをiTunes用にアーカイブする必要があるたびに、それは構成の地獄です。
  • プロジェクトをチームや顧客と共有する必要があるたびに、何らかの理由(コンテキスト、Xcodeバージョンなど)でプロジェクトが中断する可能性があります。

私の選択は、ついに単純にフレームワークを使用することでした-いつも-Apple(WWDCビデオ)が推奨するように。

それはとても簡単で、最後に同じ仕事をします!

機能していると思われるもう1つの非常にエレガントなソリューションは、プライベートCocoapodを使用することです。Cocoapodsは、すべての構成作業、ヘッダーのコピーなどを行います。

フレームワークがロック!


1
これはどこに設定しますか?simply use frameworks - always -
Neil Faulkner、

どこにも設定されていません。それは単にアーキテクチャ上の選択です。フレームワークは、リンクと管理がはるかに簡単な「モダンライブラリ」です。このメッセージの時点では、swiftはまだバイナリライブラリのビルドを許可していません。
ムース

0

これが私にとって同じ問題を解決したものです。

App TargetとiMessage Extension Targetがあります。次に、2つのSDK(自分のもの)を用意しました。これは、App Targetがリンクします。

問題は次のとおりです。私のiMessageターゲットも私の2つのSDK(個別のプロジェクト)を使用していましたが、ビルドフェーズでリンクされていませんでした->バイナリとライブラリをリンクしました。私の2つのSDKをiMessageターゲットに追加して、アプリターゲットと一致させる必要がありました。

したがって、この話の教訓は次のとおりです。拡張機能などの複数のターゲットがある場合は、すべてのターゲットが必要なライブラリにリンクしていることを確認してください。ビルドしてシミュレータとデバイスにデプロイできましたが、アーカイブできませんでした。


0

アップデート:Xcode 9

上記の答えはXcode 9を使用して私にはうまくいきませんでしたが、この答えは私にとって完全にうまくいきました。$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include「ヘッダー検索パス」に追加しましたが、Xcodeは静的ライブラリのヘッダーを問題なくリンクしました。


-18

トラブルを解消してこれを実行してください= Macで新しいユーザーアカウントを作成してください-新しいユーザーアカウントでプロジェクトを開いてください-すべての問題が消えます。時間を節約し、正気を保ちましょう。これらのオタクの返信はすべて役に立ちません!!

幸運を

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.