プロジェクトのプロパティの操作
IDE では、すべてのコンパイラ オプション、リンカー オプション、デバッガーの設定、およびカスタム ビルド ステップは、プロパティとして公開されます。プロパティを表示および変更するには、プロジェクトのプロパティ ページを使用します。ビルド構成 (デバッグまたはリリース) と対象プラットフォーム (Win32、x64、または ARM) の組み合わせに対してプロジェクトのプロパティを個別に適用できます。また、プロジェクト内の個々のファイルについてプロパティを設定できます。
ユーザー単位またはコンピューター単位で "global" プロパティを設定できますが、お勧めしません。代わりに、再利用したり他の人と共有する各種類のプロジェクトの設定を保存するためにプロパティ マネージャーを使用してプロパティ シートを作成することをお勧めします。また、プロパティ シートは、他の種類のプロジェクトのプロパティ設定が誤って変更されることを防止します。プロパティ シートについては、この記事の後半で詳しく解説します。
プロパティ マネージャーを表示するには、メニュー バーで [表示]、[その他のウィンドウ]、[プロパティ マネージャー] の順にクリックします。
Visual C++ プロジェクト システムは MSBuild に基づいています。XML プロジェクト ファイルとプロパティ シートをコマンド ラインで直接編集できますが、IDE を使用することをお勧めします (特に継承に参加するプロパティを変更する場合)。MSBuild で有効な、手動で編集されるファイルは必ずしも Visual C++ プロジェクト システムによって読み取り可能ではなく、ビルド プロセスに微妙なエラーを発生させる可能性があります。
プロジェクト ファイルは、.vcxproj というファイル名拡張子を持つ XML ファイルです。IDE で設定するすべてのプロパティは、プロジェクト ファイルに直接書き込まれるか、またはビルド時にインポートされるプロパティ シートに書き込まれます。
次の図は、Visual C++ プロジェクトのプロパティ ページを示しています。左ペインで、[VC++ ディレクトリ] の規則が選択され、右ペインで、その規則に関連付けられたプロパティが表示されていることに注意してください($(...) の値はマクロです。これについてはこの記事の後半で説明します)。VC++ ディレクトリは構成プロパティであり、構成が異なると (たとえばデバッグとリリース) その値も異なります。ダイアログ ボックスの上部にある [構成] および [プラットフォーム] ボックスを使用して、プロパティを適用する構成を設定できます。多くの場合、[すべてのプラットフォーム] と [すべての構成] が右側の選択となります。[共通プロパティ] 規則の設定は、すべての構成に適用されます。
プロジェクトのプロパティの設定
プロジェクトのプロパティを設定する一般的な方法は次のとおりです。
プロジェクトのプロパティを設定するには
メニュー バーで [プロジェクト]、[プロパティ] の順に選択します。または、ソリューション エクスプローラーまたはプロパティ マネージャーでプロジェクトのショートカット メニューを開き、[プロパティ] をクリックします。[プロパティ ページ] ダイアログ ボックスが開きます。
ダイアログ ボックスの上部にあるボックスで、設定を適用する構成とプラットフォームを選択します。
[構成] ボックスに表示される構成を作成または変更するには、[構成マネージャー] をクリックします。
プロパティ値を設定します。[OK] をクリックすると、新しい値がプロジェクト ファイルに書き込まれます。
[!メモ]
[プロパティ ページ] ダイアログ ボックスには、現在のプロジェクトに適用するプロパティ ページのみが表示されます。たとえば、プロジェクトに .idl ファイルが含まれていない場合、MIDL プロパティ ページは表示されません。
[プロパティ ページ] ダイアログ ボックスのプロパティの詳細については、以下のトピックを参照してください。
ヒント |
---|
[クイック起動] ウィンドウに名前を入力して、プロパティ ページを直接開くことができます。 |
ハードコーディングされたプロパティとマクロ
一部のプロジェクト プロパティは、別の場所で定義されたプロパティへの参照を値として取得できます。この種類の値はマクロと呼ばれ、他の種類のプロジェクト プロパティ設定と区別されます。マクロは、MSBuild システムによって定義された、または自分で定義したプロパティを参照できます。ディレクトリ パスなどのハードコーディングされた値の代わりにマクロを使用することで、コンピューター間や Visual Studio のバージョン間でより簡単にプロパティ設定を共有でき、プロジェクト設定がプロパティ継承に適切に参加できるようにします。
グローバル マクロ
プロジェクト構成のすべての項目に適用されます。$(name) の構文を持ちます。Visual Studio インストールのルート ディレクトリを格納するグローバル マクロの例は $(VCInstallDir) です。グローバル マクロは、MSBuild の PropertyGroup に対応します。項目マクロ
%(name) の構文を持ちます。ファイルの場合、項目マクロはそのファイルのみに適用されます。たとえば、%(AdditionalIncludeDirectories) を使用して、特定のファイルだけに適用するインクルード ディレクトリを指定します。この種類の項目マクロは、MSBuild の ItemGroup のメタデータに対応します。プロジェクト構成のコンテキストで使用される場合、項目マクロは、特定の種類のすべてのファイルに適用されます。たとえば、C/C++ [プリプロセッサの定義] 構成プロパティは、プロジェクトのすべての .cpp ファイルに適用する %(PreprocessorDefinitions) 項目マクロを使用できます。この種類の項目マクロは、MSBuild の ItemDefinitionGroup のメタデータに対応します。詳細については、「項目定義」を参照してください。
マクロを使用してプロパティ値を定義し、プロパティ エディターを使用して利用可能なマクロの値を表示できます。
プロパティ エディター
プロパティ エディターを使用して、特定の文字列プロパティを変更し、値としてマクロを選択できます。プロパティ エディターにアクセスするには、プロパティ ページのプロパティを選択し、右側のドロップダウン矢印をクリックします。ドロップダウン リストに [<編集>] が含まれている場合、それを選択すると、そのプロパティのプロパティ エディターを表示できます。
プロパティ エディターで [マクロ] をクリックすると、使用できるマクロとその現在の値を表示できます。次の図は、[マクロ] がクリックされた後の [追加のインクルード ディレクトリ] プロパティのプロパティ エディターを示しています。[親またはプロジェクトの既定値から継承] チェック ボックスをオンにして新しい値を追加すると、現在継承されているすべての値に追加されます。チェック ボックスをオフにすると、継承された値が新しい値に置き換えられます。ほとんどの場合、チェック ボックスはオンのままにします。
再利用可能なプロパティ構成の共有
複数のプロジェクトに適用する、よく使用される共通のプロパティ セットを持つ場合、プロパティ マネージャーを使用してそれらを再利用可能なプロパティ シート ファイルにキャプチャできます。これは慣例により .props ファイル名拡張子を持ちます。プロパティを最初から設定しなくても済むように、そのシートを新しいプロジェクトに適用できます。プロパティ マネージャーにアクセスするには、メニュー バーで [表示]、[プロパティ マネージャー] の順にクリックします。
[新しいプロジェクト プロパティ シートの追加] を選択し、次に、たとえば MyProps.props プロパティ シートを選択すると、プロパティ ページ ダイアログ ボックスが表示されます。これは MyProps プロパティ シートに適用されることに注意してください。行った変更は、プロジェクト ファイル (.vcxproj) ではなくシートに書き込まれます。
.vcxproj ファイルで同じプロパティが直接設定されている場合、プロパティ シートのプロパティはオーバーライドされます。
必要に応じて何度でもプロパティ シートをインポートできます。ソリューション内の複数のプロジェクトが同じプロパティ シートから設定を継承することができ、プロジェクトは複数のシートを持つことができます。プロパティ シート自体は別のプロパティ シートから設定を継承できます。
重要 |
---|
既定では、.props ファイルはプロジェクト項目として作成されていないため、ソース管理に含まれません。ソース管理に含める場合は、ソリューション項目として手動でファイルを追加できます。 |
プロパティ シートを作成するには
メニュー バーで [表示]、[プロパティ マネージャー] の順にクリックします。プロパティ マネージャーが開きます。
プロパティ シートのスコープを定義するには、適用する項目を選択します。これは、特定の構成または別のプロパティ シートです。この項目のショートカット メニューを開き、[新しいプロジェクト プロパティ シートの追加] を選択します。名前と場所を指定します。
プロパティ マネージャーで新しいプロパティ シートを開き、含めるプロパティを設定します。
プロパティの継承
プロジェクト プロパティは、レイヤー化されています。各レイヤーは前のレイヤーの値を継承しますが、継承された値は、プロパティを明示的に設定することによりオーバーライドできます。基本的な継承ツリーを次に示します。
MSBuild CPP ツールセットの既定の設定 (.vcxproj ファイルによってインポートされる ..\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.Default.props)
プロパティ シート
.vcxproj ファイル(既定値とプロパティ シートの設定をオーバーライド可能)。
項目メタデータ
ヒント |
---|
プロパティ ページで、bold のプロパティは、現在のコンテキストで定義されます。通常フォントのプロパティが継承されます。 |
プロジェクト ファイル (.vcxproj) は、ビルド時に他のプロパティ シートをインポートします。すべてのプロパティ シートがインポートされた後、プロジェクト ファイルが評価され、プロパティ値の最後の定義が使用されます。指定したプロパティ値がどのように継承されているかを特定するために、拡張されたファイルを表示すると便利な場合があります。拡張されたバージョンを表示するには、Visual Studio コマンド プロンプトで次のコマンドを入力します(プレースホルダー ファイル名を適宜変更してください)。
msbuild /pp:temp.txtmyapp**.vcxproj**
拡張されたプロジェクト ファイルは大きく、MSBuild に詳しくない場合は理解するのが難しい可能性があります。プロジェクト ファイルの基本的な構造を次に示します。
IDE では公開されていない基本的なプロジェクトのプロパティ。
ツールセットに依存しない一部の基本的なプロパティを定義する Microsoft.cpp.default.props のインポート。
グローバル構成プロパティ ([構成概要] ページの [PlatformToolset] および [プロジェクト] 既定プロパティとして公開されます)。これらのプロパティは、次の手順の Microsoft.cpp.props でインポートされるツールセットおよび組み込みプロパティ シートを決定します。
プロジェクトのほとんどの既定値を設定する Microsoft.cpp.props のインポート。
.user を含むすべてのプロパティ シートのインポート。これらのプロパティ シートは [PlatformToolset] および [プロジェクト] 既定プロパティを除くすべてをオーバーライドできます。
プロジェクト構成プロパティの残り。これらの値は、プロパティ シートの設定をオーバーライドできます。
項目 (ファイル) とそのメタデータ。これらは、他のプロパティやインポートの前に発生した場合でも、常に MSBuild 評価規則の最後の単語です。
詳細については、「MSBuild プロパティ」を参照してください。
.user ファイルとそれが問題になる理由
Visual Studio の過去のバージョンでは、.user ファイル名拡張子を持つ、<userprofile>\AppData\Local\Microsoft\MSBuild\v4.0\ フォルダーにあるグローバル プロパティ シートを使用していました。これらのファイルは、ユーザー単位、コンピューター単位でプロジェクト構成のプロパティを設定するため、現在はお勧めしていません。このような "global" 設定は、特にビルド コンピューター上で複数のプラットフォームを対象とする場合にビルドに影響する可能性があります。たとえば、MFC プロジェクトと Windows Phone プロジェクトの両方を持つ場合は、.user プロパティはいずれか 1 つに対して無効となります。再利用可能なプロパティ シートは、より柔軟で堅牢です。
現在も .user ファイルは Visual Studio によってインストールされ、プロパティ継承に参加しますが、既定では空です。最も良い方法は、プロジェクトがすべてのユーザー単位、コンピューター単位の設定に関係なく動作するように、プロパティ マネージャーでそれらへの参照を削除することです。これは、SCC (ソース コード管理) 環境で適切な動作が行われるようにするために重要です。
既定のディレクトリ セットへのインクルード ディレクトリの追加
プロジェクトにインクルード ディレクトリを追加する場合、すべての既定のディレクトリをオーバーライドしないことが重要です。ディレクトリを追加するための正しい方法は、"C:\MyNewIncludeDir\" のような新しいパスを追加し、プロパティ値に $(IncludePath) マクロを追加することです。
ユーザー定義マクロの作成
プロジェクト ビルドで変数として使用するユーザー定義マクロを作成できます。たとえば、ユーザー定義のマクロを作成して、カスタム ビルド ステップまたはカスタム ビルド ツールに値を渡すことができます。ユーザー定義マクロは、名前と値のペアです。プロジェクト ファイル内では、$(name) という表記を使用して、その値にアクセスします。
ユーザー定義マクロは、プロパティ シートに格納されます。プロジェクトにプロパティ シートが含まれていない場合は、この記事の前半で説明した手順で作成します。
ユーザー定義マクロを作成するには
[プロパティ マネージャー] ウィンドウ (メニュー バーで [表示]、[プロパティ マネージャー] の順に選択) で、プロパティ シート (名前の末尾が .user) のショートカット メニューを開き、プロパティを選択します。そのプロパティ シートの [プロパティ ページ] ダイアログ ボックスが開きます。
ダイアログ ボックスの左ペインで、[ユーザー マクロ] を選択します。右ペインで [マクロの追加] をクリックすると、[ユーザー マクロの追加] ダイアログ ボックスが表示されます。
ダイアログ ボックスで、マクロの名前と値を指定します。オプションで、[ビルド環境でこのマクロを環境変数に設定する] チェック ボックスをオンにします。
ビルドの環境変数の設定
Visual C++ コンパイラ (cl.exe) は、特定の環境変数、特に LIB、LIBPATH、PATH、および INCLUDE を認識します。IDE でビルドすると、[VC++ ディレクトリ] プロパティ ページ プロパティ ページで設定されたプロパティを使用して環境変数が設定されます。LIB、LIBPATH、および INCLUDE の値が既に設定されている場合 (たとえば、開発者コマンド プロンプトによって)、それらは対応する MSBuild プロパティの値に置き換えられます。その後、ビルドによって、VC++ ディレクトリの実行ファイル ディレクトリのプロパティの値が PATH に追加されます。ユーザー定義マクロを作成して [ビルド環境でこのマクロを環境変数に設定する] チェック ボックスをオンにすると、ユーザー定義の環境変数を設定できます。
デバッグ セッションの環境変数の設定
プロジェクトの [プロパティ ページ] ダイアログ ボックスの左ペインで [構成プロパティ] を展開し、[デバッグ] を選択します。
右ペインで [環境] または [マージ環境] プロジェクト設定を変更して [OK] をクリックします。
すべてのマクロとその値の表示
プロジェクトの [プロパティ ページ] ダイアログ ボックスで、[VC++ ディレクトリ] などの文字列プロパティを選択し、右側の列の下向き矢印ボタンをクリックし、[<編集>] をクリックしてプロパティ エディターを開きます。プロパティ エディターで [マクロ] をクリックします。
複数の構成でのプロパティの同時設定
すべての構成のプロパティを設定するには、プロジェクトの [プロパティ ページ] ダイアログ ボックスの上部にあるボックスで、[すべての構成] および [すべてのプラットフォーム] を選択し、必要なプロパティを設定します。
一部の構成のプロパティを設定するには、[プロパティ マネージャー] でそれらを複数選択し、ショートカット メニューを開いて [プロパティ] を選択します。変更した設定が、選択したすべての構成に適用されます。
また、複数の構成に対して 1 つのプロパティ シートを作成できます。これを行うには、各構成のプロパティ シートを作成し、そのうちの 1 つのショートカット メニューを開き、[既存のプロパティ シートの追加] を選択し、他のシートを追加します。ただし、1 つの共通のプロパティ シートを使用する場合は、プロパティを設定するときにシートが適用されるすべての構成セットが取得されることや、IDE では指定されたプロパティ シートから継承されるプロジェクトまたは他のプロパティ シートが表示されないことに注意してください。
多くのプロジェクトを持つ大規模なソリューションでは、ソリューション レベルでプロパティ シートを作成すると便利な場合があります。ソリューションにプロジェクトを追加する場合、プロジェクトにそのプロパティ シートを追加するにはプロパティ マネージャーを使用します。プロジェクト レベルでの必要に応じて、新規プロパティ シートを追加してプロジェクト固有の値を設定できます。
すべてのオプションを迅速に参照および検索するには
[すべてのオプション] プロパティ ページ ([プロパティ ページ] ダイアログ ボックスの左ペインの [C/C++] ノードの下) には、現在のコンテキストで使用できるプロパティを簡単に参照および検索する方法が用意されています。これには特別な検索ボックスと単純な構文が用意されており、結果をフィルター処理できます。
プレフィックスなし:
プロパティ名のみで検索 (大文字と小文字を区別しない部分文字列)。'/' または '-' :
コンパイラ スイッチのみで検索 (大文字と小文字を区別しないプレフィックス)。v:
値のみで検索 (大文字と小文字を区別しない部分文字列)。