12

以下は、通常の VS2010 C++ プロジェクトから取得したものです。

    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <Optimization>MaxSpeed</Optimization>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>

編集PreprocessorDefinitionsすると、プリプロセッサで使用される定義を設定できます。これは、コードで#ifdefetcを介して確認できます。

ただし、次を使用する場合

  <Target Name="NormalBuild" Condition=" '$(_InvalidConfigurationWarning)' != 'true' " DependsOnTargets="_DetermineManagedStateFromCL;CustomBeforeBuild;$(BuildDependsOn)" Returns="@(ManagedTargetPath)">
    <ItemGroup>
        <ManagedTargetPath Include="$(TargetPath)" Condition="'$(ManagedAssembly)' == 'true'" />
    </ItemGroup>
      <Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)" Importance="High" />
  </Target>

  <Target Name="TestBuild" Returns="@(ManagedTargetPath)">
    <MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"/>
  </Target>

PreprocessorDefinitions設定した値を含むメッセージを介して確認することもできますが、Properties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"ビルドを制御できませんなどを使用してビルドを制御するためのこれらのキーのいずれか。#ifdefPreprocessorDefinitions<Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>#ifdef

  1. 何故ですか?
  2. Propertiestasks要素を介して VS2010 C++ プロジェクトに PreprocessorDefinitions を渡すにはどうすればよいですか?
4

3 に答える 3

36

これは、元のプロジェクトを変更せずに実行できます。Microsoft.Cpp.Targets通常、通常の C++ プロジェクトにインポートされる最後の処理の 1 つである で最初に実行されることは、呼び出されたプロパティがあるかどうかを確認し、存在する場合はForceImportBeforeCppTargetsそれをインポートすることです。

したがって、次ADDITIONALのように「override.props」ファイルを作成するプリプロセッサ定義に追加するとします (完全な自動化では、WritelinesToFileタスクを使用してファイルを作成します)。

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions);ADDITIONAL</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>

</Project>

そして電話する

<MSBuild Projects="demo.vcxproj" 
         Properties="ForceImportBeforeCppTargets=override.props"/>

またはコマンドラインから

msbuild demo.vcxproj /p:ForceImportBeforeCppTargets=override.props

richbがコメントで指摘しているように、上記は msbuild のルックアップ ルールによって override.props が見つかる場合にのみ機能することに注意してください。常に検出されるようにするには、完全なパスを指定するだけです。

アップデート

数年後、msbuild 15 以降では、ビルドをカスタマイズする新しい方法があります。上記と同じ原理ですが、より単純です。msbuild はDirectory.Build.props、追加のコマンドライン オプションを必要とせずに、プロジェクト ファイルのディレクトリまたはその上のすべてのディレクトリで指定されたファイルを自動的に取得します (したがって、VS 内からも問題なく動作します)。また、プロジェクト ファイルも少し冗長になりました。

<Project>
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions);ADDITIONAL</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>
于 2013-07-03T11:22:51.607 に答える
8

ではないofにdemo.vcxprojアクセスする必要があり、MSBuild コマンド ライン経由で渡すことができないため、変更せずにこれを行うことはできません。PreprocessorDefinitionsCLCompilePropertyGroup

Project Properties -> Configuration Property -> C/C++ -> Preprocessorを使用して、GUI でプリプロセッサ定義を変更するか、XML を直接編集できます。

  <ClCompile>
    ....
    <PreprocessorDefinitions>$(MyMacro);%(PreprocessorDefinitions)</PreprocessorDefinitions>
  </ClCompile>

MSBuild プロジェクトで:

  <Target Name="TestBuild" Returns="@(ManagedTargetPath)">
    <MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="MyMacro=THISGETSSETBUTDOESNOTHING"/>
  </Target>

これは、MSBuild.exe を次のように実行することと同じです。

  MSBuild demo.vcxproj /p:MyMacro=THISGETSSETBUTDOESNOTHING
于 2013-02-28T17:25:33.453 に答える