現在、大規模な RAD Studio 2010 プロジェクトを XE4 に移行しています。その一環として、多くのプロジェクト ファイルを再作成しています。プリコンパイル済みヘッダーに最適なメカニズムを使用していることを確認する機会を利用したいと思います。これを行うにはいくつかの方法があるようです。
現在は 32 ビットのみでコンパイルしていますが、将来的には 64 ビット コンパイラを使用する予定です。
2010 年に現在行っていることと、XE4 で何をすべきかわからない理由を次に示します。
RAD Studio 2010 で
およびその他の一般的に使用される多くのヘッダーファイルPchApp.h
を含むファイルがあります。主に、プロジェクトで一般的に使用されるさまざまなコア クラスのヘッダーです。このヘッダーは、次のように、<vcl.h>
すべての CPP ファイルの先頭に含まれ、その後に.#pragma hdrstop
// Top of .cpp file
#include "PchApp.h"
#pragma hdrstop
// Normal includes here
#include "other.h"
#include "other2.h"
// etc
次に、プロジェクト オプションの [プリコンパイル済みヘッダー] セクションで次の設定を行います。
コンパイルは特に高速ではありません (約 350,000 行のコードで 12 分)。
- 「プリコンパイル済みヘッダー ファイルを挿入する」: これは PchApp.h を挿入する必要がありますか?
- 「プリコンパイル済みヘッダーをキャッシュする (-H または -H"xxx" と共に使用する必要があります)」: -H オプションは「PCH ファイル名」なので、それを使用していますが、確かにプリコンパイル済みヘッダーのポイントは、"キャッシュ」またはコンパイルごとに 1 回事前構築されます。これにより、どのような追加の違いが生じるでしょうか?
- .cpp ファイルに PchApp.h とプラグマ hdrstop を含める 2 行が必要ですか? プロジェクトオプションでのみこれを行う方法はありますか?すべてのファイルでこれらの2行を複製しないでください? それらは必要ですか?
言い換えれば、これらが正しい設定か最適な設定かはわかりませんが、ドキュメントを読んでもどちらが良いかわかりません。私はすべてのオプションを十分に理解していないことを認識しています-この質問の1つの理由:)
RAD Studio XE4 で
XE4 32 ビット コンパイラのオプション ダイアログは同じですが、2 つのことが私を混乱させたり、現在の 2010 のアプローチが最適であるかどうかわからなかったりします。
1. デフォルトの動作
新しい VCL フォーム プロジェクトを作成するとき、IDE はデフォルトで Project1PCH1.h という名前のヘッダーを作成します。これは、プロジェクトのプリコンパイル済みヘッダーになることを目的としています。 このヘッダーには<vcl.h>
と<tchar.h>
が含まれており、Project Manager ではノードとして表示されます。これはデフォルトの Form1.cpp には含まれていませんが、Form1.cpp の一番上にあり、その後に他のヘッダーが続きます#include <vcl.h>
。#pragma hdrstop
このヘッダーを使用する新しいプロジェクトのデフォルトの XE4 設定ダイアログは次のとおりです。
私は(素朴に?)デフォルトが実際には最良/最適な設定であるという仮定に取り組んでいます。いくつかのことが私を困惑させます:
- プロジェクトの想定されるプリコンパイル済みヘッダー
Project1PCH1.h
は、プリコンパイル済みヘッダー設定のどこにも記載されていません。 - ヘッダーはキャッシュされません
- PCH ファイル名が指定されていません (これは
Project1PCH1.h
?) - .cpp ファイルにはどちらも含まれていません
Project1PCH1.h
。
実際、私が見つけることができる方法で参照されていないため、コンパイラまたはIDEが実際に使用することになっていること、Project1PCH1.h
または使用することになっている.cppファイルを実際にどのように認識しているかわかりません。
これは私にとって最も不可解なことであり、この質問をして、PCHes に関する私の混乱をすべて解消することに拍車をかけました。IDE のデフォルト設定をコピー/使用することを計画していましたが、その動作を理解するまでは使用したくありません。
2. PCH ウィザード
2010 年以降、IDE にはプリコンパイル済みヘッダー ウィザードが含まれています。私はそれを機能させることができませんでした-結果を取得し、「機能しない」という私の記憶を説明するために今もう一度実行していますが、数時間かかるようですので、この質問を更新します後で。
編集:数時間かかりますが実行され、(ソースベースを知っている私には)奇妙なヘッダーのリストが生成されます。数年前に試したときの記憶では、まったく実行されませんでした - 明確な改善です。
存在するため、2010 プロジェクトをアップグレードするために作成された新しく作成されたプロジェクト ファイルでプリコンパイル済みヘッダーを使用して設定するのが最善の方法かもしれません。どうすれば最善ですか?PchApp.h を含むすべての .cpp ファイルで混乱しますか?
質問
その背景として、次の質問があります。
- 既存の設定。新しいプロジェクト ファイルを作成し、何千もの既存の .cpp ファイルを追加しています。すべて先頭に「#include PchApp.h; #pragma hdrstop」を付けています。既存の RS2010 PCH 設定をコピーする必要がありますか? 上記の 2 行を削除して、別のものに置き換える必要がありますか?
- PCH ウィザードの使用:あなたの経験では、これは最適な設定を作成しますか? 変更された場合にプロジェクトの大部分が再構築される (おそらくコーディングには最適ではない) ファイルが含まれていますか? 既存のプロジェクトで使用することは可能ですか?それとも、使用する前に「#include PchApp.h」のようなアイテムを削除する必要がありますか?
- CPP ファイル / ユニットと正しいインクルード。プリコンパイル済みヘッダーを使用する .cpp ファイルには、プリコンパイル済みヘッダー自体は含まれていませんが、.cpp が実際に必要とするヘッダーのみが含まれている必要があります (PCH に含まれている場合でも)。現在の状況で、PchApp.h ファイルにいくつかの一般的なヘッダーが含まれているため、.cpp ファイルにはそれら自体が実際には含まれていない場合はどうでしょうか? PchApp.h のインクルードを削除し、特定の .cpp ファイルが必要とする PchApp.h のヘッダーのサブセットに置き換える場合、#pragma hdrstop の上または下に配置する必要がありますか? (上記だと思います。)次に、プリコンパイル済みヘッダーに含まれていない上記の何かを含めるとどうなりますか-その特定のユニットのPCH使用を変更し、PCHを再構築します(パフォーマンスの問題?)など?
- デフォルト設定:新しいプロジェクトのデフォルト設定が最適であると仮定すると、現在のシステムをそれを使用するように移行するにはどうすればよいですか?
- デフォルト以外のセットアップ:デフォルトのセットアップが最適でない場合、それは何ですか? これが重要な質問だと思います。
- 32 ビットと 64 ビット:まもなく 64 ビットに移行することを知っていますが、プリコンパイル済みヘッダーを 32 ビットと 64 ビットの両方で動作させるにはどうすればよいでしょうか? すべての PCH の知識は、.cpp ファイルではなくプロジェクト オプションに含まれている必要があるため、32 ビットと 64 ビットのコンパイルでは異なる設定が必要ですか?
ベスト プラクティス、設定オプション、.cpp ファイル、ヘッダー、および/またはプロジェクト ファイルに含める項目などを明確に説明する、明確で詳細な、説明的で、指針となる回答を求めています。つまり、何か今までに(上記のすべての後!)かなり混乱した理解を解決するために。将来、他の C++Builder ユーザーが PCH リファレンスとして使用できる高品質の回答は優れています。可能であれば、数日以内に報奨金を追加するつもりです。