Xcode 6でProjectName-Prefix.pchが自動的に作成されないのはなぜですか?


264

ProjectName-Prefix.pch自動的に作成されないのはなぜXcode 6ですか?

プリコンパイルヘッダーは不要ですか?

ProjectName-Prefix.pch以前にあったコードはどこに書くべきですか?

回答:


136

モジュールのせいだと思う#import <Cocoa/Cocoa.h>

プレフィックスヘッダーに配置するコードを配置する場所については、プレフィックスヘッダーに配置するコードはありません。それらを必要とするファイルにインポートを置きます。定義を独自のファイルに入れます。マクロを置く...どこにも。他に方法がない場合(必要な場合など)を除いて、マクロの記述を停止します__FILE__。マクロが必要な場合は、マクロをヘッダーに入れて含めます。

接頭辞ヘッダーは、巨大で、システム全体のほぼすべてで使用される(のようなFoundation.h)場合に必要でした。巨大でユビキタスなものがあれば、アーキテクチャを再考する必要があります。プレフィックスヘッダーはコードの再利用を困難にし、リストされたファイルのいずれかが変更される可能性がある場合、微妙なビルドの問題を引き起こします。プレフィックスヘッダーによって劇的に改善されることを示すことができる深刻なビルド時の問題が発生するまで、これらを回避してください。

その場合、それを作成してclangに渡すことができますが、それが優れたアイデアであることは非常にまれです。


編集:すべてのView Controllerで使用するHUDに関する特定の質問には、はい、実際にそれを使用するすべてのView Controllerに絶対にインポートする必要があります。これにより、依存関係が明確になります。新しいプロジェクトでビューコントローラーを再利用すると(コントローラーを適切に構築する場合に一般的です)、必要なものがすぐにわかります。これはカテゴリにとって特に重要であり、暗黙的な場合、コードの再利用が非常に困難になる可能性があります。

PCHファイルは、依存関係の一覧表示を取り除くためのものではありません。あなたはまだインポートする必要がありますUIKit.hFoundation.h必要に応じてXcodeのテンプレートがそうであるように、。PCHの理由は、(UIKitのように)非常に大規模なヘッダーを扱う場合のビルド時間を改善するためです。


102
@ロブあなたの答えは主観的な怒りです。私はそれがこの質問に対する回答として受け入れられるべきであることに同意しません。このgithub.com/seancook/TWReverseAuthExample/blob/…などをpchなしでどのように実装しますか?すべてのファイルにログをインポートしますか?これにより、コードに不要な膨張が山積みになります。
Maxim Veksler、2014

26
実際にそのマクロを使用する各ファイル、はい(私の経験では、これは通常、システム内のすべてのファイルよりも少ないです)。これは私のポイントの非常に良い例です。これをインポートすると、このロギングマクロに依存しているという事実が暗黙的にマスクされます。TWAPIManager.mたとえば、別のプロジェクトにをコピーしようとすると、TWALog()定義されていないエラーが発生し、どこにあるかについてのヒントがありません。コードを共有しようとしているいくつかの大規模なプロジェクトで、まさにその問題に遭遇しました。これを作成TWAPILog.hしてインポートすると、簡単な開発コストでこれを解決できます。
Rob Napier 14

5
私はほとんどすべてのクラスでReactiveCocoaを使用していますが、pchファイルを使用しないのは正気ではありません...
Stefano Mondino '30

2
モジュールだけでなく、迅速なサポートもおそらく大きな要素です。
uchuugaka 2014年

12
重要なのは、PCHがプリコンパイル済みヘッダーであることです。事前コンパイルはビルドのパフォーマンスのためであり、自動可用性ではありません。プリコンパイルでは、ビルドをめちゃくちゃにするいくつかの方法が導入されており、クリーンでないビルド(Foundationなど)の間で決して変更されない巨大なもののために予約する必要があります。
Rob Napier

425

それが適切かどうかの質問がなければ、手動でPCHファイルを追加できます。

  1. 新しいPCHファイルをプロジェクトに追加します:新規ファイル>その他> PCHファイル

  2. ターゲットのビルド設定オプションで、プレフィックスヘッダーの値をPCHファイル名に設定し、プロジェクト名をプレフィックスにします(つまり、という名前のプロジェクトとという名前のTestProjectPCHファイルMyPrefixHeaderFileの場合、値TestProject/MyPrefixHeaderFile.pchをplistに追加します)。

    ヒント:$(SRCROOT)またはなど$(PROJECT_DIR)を使用.pchして、プロジェクト内のを配置するパスに到達できます。

  3. ターゲットのビルド設定オプションで、値を設定しますプリコンパイルプレフィックスヘッダをしますYES


32
PCHファイルに関する私の意見にもかかわらず、+ 1。ツールの使用方法を知っていることは、依然として役に立ちます。
Rob Napier

20
@Yedidya、私はあなたがそれについてどんな判断を下しても、質問への回答を伝えるために時間を割いてくれたことに素早い感謝を述べたかっただけです。私は人々が時間を割いて質問に忠実に答えるとき、その質問がどれほどひどいアドバイスを受けているかについて人を怒らせるだけでなく、感謝しています。
campo

3
ありがとう。Objective-Cの一部をSwiftプロジェクトに組み込むときに便利なので、戻って各.mファイルに大量のインクルードファイルを追加する必要はありません。
クリスプリンス14

ObjCからSwiftへの移行時に非常に便利です。ObjCで作成されたライブラリのヒープがあり、最後に、すべてのライブラリを編集して、適切なシステムヘッダーを含めます。
エシュロン

1
ターゲットのビルド設定を使用したため、これは機能しませんでした。ただし、この手順に従ってプロジェクトのビルド設定を変更すると、すべてが機能しました。
Pauls

128

独自のPCHファイルを作成する必要があります
追加New file -> Other-> PCH file

次に、このPCHファイルのパスをビルドに追加します setting->prefix header->path

($(SRCROOT)/ファイル名.pch)

ここに画像の説明を入力してください


3
まあ、作業ディレクトリに応じて、変数は異なる場合があります。私が使用しています$(PRODUCT_DIR)/$(PRODUCT_NAME)/PrefixHeader.pch
AlejandroIván2015年

特定のフォルダー内に.pchファイルを保持すると、状況が発生します。
Prakash Raj

51

写真でお見せします!

  1. 新しいファイルを追加 新しいファイルを追加

  2. 移動し、プロジェクト/ビルド設定/ APPL LLVM 6.0言語 新しいファイルを追加


24

.pchファイルを追加するには

1)新しい.pchファイルをプロジェクトに追加します->新しいファイル->その他-> PCHファイル

2)プロジェクトのビルド設定に移動します。

3)「プレフィックスヘッダー」を検索します。Apple LLVMでそれを見つけることができます。

4)これをフィールドに貼り付けます $(SRCROOT)/yourPrefixHeaderFileName.pch

5)プロジェクトをクリーンアップしてビルドします。それでおしまい!!!

ここに画像の説明を入力してください


12

.pchファイルを手動で追加することを決定し、xCode 6の前と同じようにObjective-Cを使用する場合は、UIKitおよびFoundationフレームワークを.pchファイルにインポートする必要もあります。それ以外の場合は、これらのフレームワークを各ヘッダーファイルに手動でインポートする必要があります。使用する言語をテストするので、とにかく次のコードを追加できます。

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
#endif

2
ObjCコードを含むすべてのものは、上記の#ifdef _ OBJC _ 内にラップする必要があります。そうしないと、理解できないCソース(このようなソースがある場合)からエラーが発生します
ishahak


7

新しいPCHファイルを追加するには、次の手順に従います。

(1)新しいファイルを追加-iOSを選択-その他とPCHファイル

(2)このPCHファイルのパスをプロジェクトに追加します-BuildSetting-Apple LLVM 6.0 Language

Add PrefixヘッダーパスYourApplicationName(root-path)/filename.pchを追加


最後の1つを親切に説明してください。セットプレフィックスヘッダーパスを追加します。
Naveed Abbas 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.