2013-02-28 58 views
7

以下は、通常のVS2010 C++プロジェクトのものです。私はPreprocessorDefinitionsを編集する場合msbuildタスクのタスクプロパティとしてPreProcessorDefinitionsを設定する方法

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

私はプリプロセッサで使用される定義を設定することができます。私は、私は、次の

<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 iがProperties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"を介して設定された値が含まれていますが、私は私をコントロールすることができないというメッセージを介して見ることができますしかしなど#ifdefを経由して私のコードで

これを見ることができます私は通常のセットアップを使用している場合など#ifdef を使用して構築し、フィールドが実際に空白で、私が使用して#ifdefなどを自分のビルドを制御するためにこれらのキーのいずれかを使用することができますが、予想<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>が含まれていません<Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"を使用して出力PreprocessorDefinitionsにしてみてください

  1. なぜですか?
  2. Propertiesという要素を使用してVS2010 C++プロジェクトのプリプロセッサ定義を渡すにはどうすればよいですか?

答えて

6

あなたはCLCompilePreprocessorDefinitionsにアクセスする必要があるためPropertyGroupされていない、demo.vcxprojを変更せずにこれを行うことはできませんので、MSBuildのコマンドラインを介して渡すことはできません。

あなたはプロジェクトのプロパティを経由してGUIでのプリプロセッサの定義を変更することができます - > [設定Propertis - > C/C++ - 直接>プリプロセッサ、または編集XML:あなたのMSBuildプロジェクトで

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

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

これはとのMSBuild.exeを実行するのと同じです

+0

これは私の2017バージョンでは動作していませんが、ClCompileセクションはありません。 – Pysis

+0

まだ私のために働いています。それはC++プロジェクトですか? –

+0

私はしばしばこのMSVC/VS世界では動作しません..、もっとEclipse。私は新しいフォルダと空のcppファイルを追加しましたが、ビルドパスのように、まだ認識されていないと思っていました。そして/またはC++の 'ファセット'は '集約'プロジェクトファイルにありませんでした。このエラーがxkeycheckエラーの原因となった独自のプリプロセッサステートメントを定義している個々のサブプロジェクトのvcxprojファイルにあると分かったら、これらのプロジェクトのそれぞれが編集するものであることがわかりました。 – Pysis

30

これは元のプロジェクトを変更せずに行うことができます。まず最初にMicrosoft.Cpp.Targetsで行われたことは、普通のC++プロジェクトで最後にインポートされたものの1つで、ForceImportBeforeCppTargetsというプロパティがあるかどうかを確認し、

<?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> 

そして

を呼び出す:

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

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

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

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

richbがコメントの中で指摘しているように、上記の動作はmsbuildのルックアップルールによってoverride.propsが見つかる場合にのみ有効です。常に完全なパスを指定するだけです。

+6

この情報をお寄せいただきありがとうございます。ちょうど2,3の訂正。まず、コマンドラインパラメータは/ p:not/t:です。次に、override.propsへのフルパスを指定する必要があります。それ以外の場合、msbuildは警告なしで無視します。 – richb

+0

@richb良いキャッチ編集。 – stijn

+2

私は、@ richbの完全な言及を強調したいと思います。 セクションも出力することで、リソースコンパイラの定義で動作します。 – mj2008

関連する問題