2016-08-09 4 views
2

Ich versuche, meine vcxproj mit verschiedenen Eigenschaften über die Befehlszeile auf MSBuild zu erstellen. Ich habe die WarningLevel-Eigenschaft getestet, da sie sich auf der MSDN MSBuild-Einführungsseite befindet.MSBuild überschreibt Eigenschaften beim Erstellen von VC++ - Projekt

Mein Projekt ursprünglich setzt Warning als 3. Ich begann:

msbuild myproj.vcxproj /p:Configuration=Debug /p:Platform=Win32 /p:WarningLevel=4;OutDir=test\Debug 

I Tracker Log überprüft, um zu sehen, was die Ausführung von Befehl ist, es stellte sich heraus „/ W3“ ist immer noch da außer „/ W4 " wie erwartet. "OutDir" wurde jedoch korrekt festgelegt und ich konnte Zieldateien im Verzeichnis bin \ Debug finden.

Gibt es etwas falsches, was ich mit WarningLevel gemacht habe? Wie überschreibt man Eigenschaften richtig? Bitte bring mir den richtigen Weg, ich werde dir voll und ganz dankbar sein.

Grüße,

SL

Antwort

3

Dies ist im Wesentlichen ein Duplikat this question, aber das ist für Objekte in die Liste des PreProcessorDefinitions Zugabe, die die gleichen wie zwingenden Warning nicht genau ist, wo habe nur einen Wert. So, hier ist es: WarningLevel ist keine globale Eigenschaft, wie OutDir, aber es ist Teil der ClCompile ItemDefinitionGroup, so dass Sie es nicht direkt festlegen können. Es sieht ein wenig wie diese in der Projektdatei:

<PropertyGroup> 
    <!-- global property, can be overridden on commandline --> 
    <OutDir>$(ProjectDir)$(Configuration)$(Platform)</OutDir> 
</PropertyGroup> 

<ItemDefinitionGroup> 
    <ClCompile> 
    <!-- not a global property --> 
    <WarningLevel>Level4</WarningLevel> 
    </ClCompile> 
<ItemDefinitionGroup> 

Zwei Möglichkeiten dazu finden Sie Antworten für die verknüpfte Frage zu beschäftigen:

erste Option ist die Warning auf eine andere Eigenschaft zu setzen, die Sie dann definieren auf die Befehlszeile. Gehen Sie zu Projekteigenschaften-> Konfigurationseigenschaften-> C/C++ -> Allgemein-> Warnstufe und geben Sie $ (MyWarningLevel) ein. In der Projektdatei, das sieht aus wie

<ItemDefinitionGroup> 
    <ClCompile> 
    <!-- gets it's value from a global property now --> 
    <WarningLevel>$(MyWarningLevel)</WarningLevel> 
    </ClCompile> 
<ItemDefinitionGroup> 

und es ist mit msbuild myproj.vcxproj /p:MyWarningLevel=Level3 gesetzt. Wenn nicht explizit festgelegt, wird der Standardwert verwendet.

Die zweite Option ist die Verwendung eines der Msbuild/C++ Erweiterungspunkte. Erstellen Sie eine Datei mit dem Namen override.props oder so enthält

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemDefinitionGroup $(PUT_IN_YOUR_CONDITION)> 
    <ClCompile> 
     <WarningLevel>Level4</WarningLevel> 
    </ClCompile> 
    </ItemDefinitionGroup> 
</Project> 

und haben es msbuild abholen mit msbuild myproj.vcxproj /p:ForceImportBeforeCppTargets=/path/to/override.props

+0

Danke, das zweite ist das, was ich suche. Ich versuche, den Build-Prozess mit MSBuild zu automatisieren. Mit Ihrem zweiten Vorschlag könnte ich eine Vorlage für massive Projekte erstellen. Ich werde es später versuchen, wenn ich nach Hause komme. – ZDunker

+1

Es funktioniert ziemlich gut, ich werde dieses Vorlagen-Eigenschaftsfenster für alle meine Projekte verwenden. Für den Fall, dass später noch jemand zu diesem Thread kommt und den Weg des Property Sheets versuchen möchte, müssen Sie eines beachten. Ich denke, Sie müssen Ihre Konfiguration als In-Liner als Bedingung nach ItemDefinitionGroup ausrichten. Wenn Sie diese Einstellungen beispielsweise auf Ihre Debug | Win32-Konfiguration anwenden möchten, müssen Sie die Zeile als bearbeiten – ZDunker

Verwandte Themen