.vcxproj
und .props
Dateistruktur
MSBuild ist das Standardprojektsystem in Visual Studio. Wenn Sie "Neues Projekt in Visual C++ datei>" auswählen, erstellen Sie ein MSBuild-Projekt, dessen Einstellungen in einer XML-Projektdatei mit der Erweiterung .vcxproj
gespeichert sind. Die Projektdatei kann auch Dateien und .targets
Dateien importieren.props
, in denen Einstellungen gespeichert werden können.
Wenn Sie beabsichtigen, Ihre Projekteigenschaften in der IDE zu verwalten, empfehlen wir, nur Ihre .vcxproj
Projekte in der IDE zu erstellen und zu ändern, und vermeiden Sie manuelle Bearbeitungen an den Dateien. In den meisten Fällen müssen Sie die Projektdatei nie manuell bearbeiten. Manuelle Bearbeitungen können die Projektverbindungen unterbrechen, die zum Ändern von Projekteinstellungen auf den Eigenschaftenseiten von Visual Studio erforderlich sind, und kann zu Buildfehlern führen, die schwierig zu debuggen und zu reparieren sind. Weitere Informationen zur Verwendung der Eigenschaftenseiten finden Sie unter Festlegen von C++-Compiler- und Buildeigenschaften in Visual Studio.
Die Verwaltung vieler einzelner Projekte in der IDE wird mühsam und fehleranfällig. Es ist schwierig, die Konsistenz aufrechtzuerhalten oder die Standardisierung über Mehrere zehn oder Hunderte von Projekten hinweg durchzusetzen. In diesen Fällen lohnt es sich, Ihre Projektdateien zu bearbeiten, um angepasste .props
oder .targets
Dateien für gemeinsame Eigenschaften in vielen Projekten zu verwenden. Sie können diese Dateien auch verwenden, wenn Sie Anpassungen benötigen, die in der IDE nicht möglich sind. Praktische Orte zum Einfügen von Anpassungen sind die Directory.Build.props
und Directory.Build.targets
Dateien, die automatisch in alle MSBuild-basierten Projekte importiert werden.
In einigen Fällen reichen angepasste .props
oder .targets
Dateien allein möglicherweise nicht für Ihre Projektmanagementanforderungen aus. Möglicherweise müssen Sie Projektdateien oder Eigenschaftenblätter manuell ändern .vcxproj
. Die manuelle Bearbeitung erfordert ein gutes Verständnis von MSBuild und muss die Richtlinien in diesem Artikel befolgen. Damit die IDE Dateien automatisch laden und aktualisieren .vcxproj
kann, gelten für diese Dateien mehrere Einschränkungen, die nicht für andere MSBuild-Projektdateien gelten. Fehler können dazu führen, dass die IDE abstürzt oder sich unerwartet verhält.
Für manuelle Bearbeitungsszenarien enthält dieser Artikel grundlegende Informationen zur Struktur und .vcxproj
verwandten Dateien.
Wichtige Hinweise
Wenn Sie sich dafür entscheiden, eine .vcxproj
Datei manuell zu bearbeiten, beachten Sie die folgenden Fakten:
Die Struktur der Datei muss einer vorgeschriebenen Form folgen, die in diesem Artikel beschrieben wird.
Das Visual Studio C++-Projektsystem unterstützt derzeit keine Wildcards oder Listen direkt in Projektelementen. Diese Formulare werden beispielsweise nicht unterstützt:
<ItemGroup> <None Include="*.txt"/> <ClCompile Include="a.cpp;b.cpp"/> </ItemGroup>
Weitere Informationen zur Unterstützung von Wildcards in Projekten und möglichen Problemumgehungen finden Sie unter
.vcxproj
Dateien und Wildcards.Das Visual Studio C++-Projektsystem unterstützt derzeit keine Makros in Projektelementpfaden. Dieses Formular wird z. B. nicht unterstützt:
<ItemGroup> <ClCompile Include="$(IntDir)\generated.cpp"/> </ItemGroup>
"Nicht unterstützt" bedeutet, dass Makros nicht garantiert für alle Vorgänge in der IDE funktionieren. Makros, die ihren Wert in unterschiedlichen Konfigurationen nicht ändern, sollten funktionieren, werden jedoch möglicherweise nicht beibehalten, wenn ein Element in einen anderen Filter oder ein anderes Projekt verschoben wird. Makros, die ihren Wert für unterschiedliche Konfigurationen ändern, verursachen Probleme. Die IDE erwartet nicht, dass Projektelementpfade für verschiedene Projektkonfigurationen unterschiedlich sind.
Damit Projekteigenschaften beim Bearbeiten im Dialogfeld "Projekteigenschaften " ordnungsgemäß hinzugefügt, entfernt oder geändert werden können, muss die Datei separate Gruppen für jede Projektkonfiguration enthalten. Die Bedingungen müssen in dieser Form sein:
Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"
Jede Eigenschaft muss in der Gruppe mit der richtigen Bezeichnung angegeben werden, wie in der Eigenschaftsregeldatei angegeben. Weitere Informationen finden Sie unter Property page xml rule files (XML-Regeldateien für Eigenschaftenseiten).
.vcxproj
Dateielemente
Sie können den Inhalt einer .vcxproj
Datei mit einem beliebigen Text- oder XML-Editor prüfen. Sie können sie in Visual Studio anzeigen, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt klicken und anschließend Projekt entladen > Foo.vcxproj bearbeiten auswählen.
Zunächst werden Sie feststellen, dass die Elemente auf oberster Ebene in einer bestimmten Reihenfolge angezeigt werden. Zum Beispiel:
Die meisten Eigenschaftengruppen und Elementdefinitionsgruppen werden nach dem Import für „Microsoft.Cpp.Default.props“ angezeigt.
Alle Ziele werden am Ende der Datei importiert.
Es gibt mehrere Eigenschaftengruppen, die jeweils eine eindeutige Bezeichnung besitzen und in einer bestimmten Reihenfolge auftreten.
Die Reihenfolge der Elemente in der Projektdatei ist von entscheidender Bedeutung, da MSBuild auf einem sequenziellen Auswertungsmodell basiert. Wenn Ihre Projektdatei, einschließlich aller importierten .props
und .targets
Dateien, aus mehreren Definitionen einer Eigenschaft besteht, überschreibt die letzte Definition die vorherigen. Im folgenden Beispiel wird der Wert "xyz" während der Kompilierung festgelegt, da das MSBUild-Modul während der Auswertung auf sie zuletzt stößt.
<MyProperty>abc</MyProperty>
<MyProperty>xyz</MyProperty>
Der folgende Codeausschnitt zeigt eine minimale .vcxproj
Datei. Jede .vcxproj
von Visual Studio generierte Datei enthält diese MSBuild-Elemente der obersten Ebene. Außerdem werden sie in dieser Reihenfolge angezeigt, obwohl sie möglicherweise mehrere Kopien jedes solchen Elements auf oberster Ebene enthalten können. Alle Label
Attribute sind beliebige Tags, die nur von Visual Studio als Signposts zum Bearbeiten verwendet werden; sie haben keine andere Funktion.
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
<ItemGroup Label="ProjectConfigurations" />
<PropertyGroup Label="Globals" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />
<PropertyGroup Label="Configuration" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" />
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets" />
</Project>
In den folgenden Abschnitten wird der Zweck der einzelnen Elemente und deren Reihenfolge beschrieben:
Project-Element
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns='http://schemas.microsoft.com/developer/msbuild/2003' >
Project
ist der Stammknoten. Es gibt die zu verwendende MSBuild-Version und auch das Standardziel an, das ausgeführt werden soll, wenn diese Datei an MSBuild.exe übergeben wird.
ItemGroup-Element „ProjectConfigurations“
<ItemGroup Label="ProjectConfigurations" />
ProjectConfigurations
enthält die Beschreibung der Projektkonfiguration. Beispiele dafür sind „Debug|Win32“, „Release|Win32“ und „Debug|ARM“. Viele Projekteigenschaften sind für eine bestimmte Konfiguration spezifisch. Beispielsweise möchten Sie wahrscheinlich Optimierungseigenschaften für einen Releasebuild festlegen, aber keinen Debugbuild.
Die ProjectConfigurations
Elementgruppe wird zur Erstellungszeit nicht verwendet. Für die Visual Studio-IDE muss das Projekt geladen werden. Diese Elementgruppe kann in eine .props
Datei verschoben und in die .vcxproj
Datei importiert werden. Wenn Sie jedoch Konfigurationen hinzufügen oder entfernen müssen, müssen Sie die .props
Datei manuell bearbeiten. Sie können die IDE nicht verwenden.
ProjectConfiguration-Elemente
In folgendem Codeausschnitt wird eine Projektkonfiguration dargestellt. In diesem Beispiel ist "Debug|x64" der Konfigurationsname. Der Projektkonfigurationsname muss im Format vorliegen $(Configuration)|$(Platform)
. Ein ProjectConfiguration
Knoten kann zwei Eigenschaften aufweisen: Configuration
und Platform
. Diese Eigenschaften werden automatisch mit den hier angegebenen Werten festgelegt, wenn die Konfiguration aktiv ist.
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
Die IDE erwartet, dass eine Projektkonfiguration für eine beliebige Kombination von und Platform
Werten gefunden wird, die Configuration
in allen ProjectConfiguration
Elementen verwendet werden. Oft bedeutet dies, dass ein Projekt möglicherweise sinnlose Projektkonfigurationen hat, um diese Anforderung zu erfüllen. Gehen Sie von einem Projekt mit folgenden Konfigurationen aus:
Debug|Win32
Retail|Win32
Special 32-bit Optimization|Win32
Das Projekt muss dann ebenfalls diese Konfigurationen enthalten, obwohl „Special 32-bit Optimization“ für x64 nicht von Bedeutung ist:
Debuggen|x64
Retail|x64
Special 32-bit Optimization|x64
Sie können die Build- und Bereitstellungsbefehle für alle Konfigurationen im Konfigurations-Manager für Projektmappen deaktivieren.
PropertyGroup-Element „Globals“
<PropertyGroup Label="Globals" />
Globals
enthält Einstellungen auf Projektebene, z ProjectGuid
. B. , RootNamespace
und ApplicationType
oder ApplicationTypeRevision
. Die letzten beiden definieren häufig das Zielbetriebssystem. Ein Projekt kann nur auf ein einzelnes Betriebssystem abzielen, da derzeit Verweise und Projektelemente keine Bedingungen haben können. Diese Eigenschaften werden üblicherweise nicht an anderer Stelle in der Projektdatei überschrieben. Diese Gruppe ist nicht konfigurationsabhängig, und in der Regel ist nur eine Globals
Gruppe in der Projektdatei vorhanden.
Import-Element „Microsoft.Cpp.default.props“
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.default.props" />
Das Eigenschaftenblatt "Microsoft.Cpp.default.props" ist im Lieferumfang von Visual Studio enthalten und kann nicht geändert werden. Es enthält die Standardeinstellungen für das Projekt. Die Standardwerte hängen von „ApplicationType“ ab.
PropertyGroup-Element „Configuration“
<PropertyGroup Label="Configuration" />
Eine Configuration
-Eigenschaftengruppe besitzt eine angefügte Konfigurationsbedingung (z.B. Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"
) und liegt in mehreren Kopien (eine pro Konfiguration) vor. Diese Eigenschaftengruppe hostet die Eigenschaften, die für eine bestimmte Konfiguration festgelegt sind. Zu den Konfigurationseigenschaften zählt „PlatformToolset“. Außerdem steuern diese das Einschließen von Systemeigenschaftenblättern in Microsoft.Cpp.props. Wenn Sie beispielsweise die Eigenschaft <CharacterSet>Unicode</CharacterSet>
definieren, wird das Systemeigenschaftenblatt microsoft.Cpp.unicodesupport.props eingeschlossen. Wenn Sie Microsoft.Cpp.props prüfen, wird die Zeile angezeigt: <Import Condition="'$(CharacterSet)' == 'Unicode'" Project="$(VCTargetsPath)\microsoft.Cpp.unicodesupport.props" />
.
Import-Element „Microsoft.Cpp.props“
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
Das Eigenschaftenblatt "Microsoft.Cpp.props " (direkt oder über Importe) definiert die Standardwerte für viele toolspezifische Eigenschaften. Beispiele sind die Eigenschaften Optimierung und Warnungsebene des Compilers, die TypeLibraryName-Eigenschaft des MIDL-Tools usw. Außerdem werden verschiedene Systemeigenschaftenblätter importiert, die darauf basieren, welche Konfigurationseigenschaften in der Eigenschaftengruppe unmittelbar davor definiert sind.
ImportGroup-Element „ExtensionSettings“
<ImportGroup Label="ExtensionSettings" />
Die ExtensionSettings
-Gruppe enthält Importe für die Eigenschaftenblätter, die Teil der Buildanpassungen sind. Eine Buildanpassung wird durch bis zu drei Dateien definiert: eine .targets
Datei, eine .props
Datei und eine .xml
Datei. Diese Importgruppe enthält die Importe für die .props
Datei.
ImportGroup-Element „PropertySheets“
<ImportGroup Label="PropertySheets" />
Die PropertySheets
-Gruppe enthält die Importe für Benutzereigenschaftenblätter. Bei diesen Importen handelt es sich um die Eigenschaftenblätter, die Sie über die Eigenschaften-Manager-Ansicht in Visual Studio hinzufügen. Die Reihenfolge, in der diese Importe aufgeführt werden, ist wichtig und wird im Eigenschaften-Manager dargestellt. Die Projektdatei enthält normalerweise mehrere Instanzen von dieser Art von Importgruppe (eine pro Projektkonfigurationen).
PropertyGroup-Element „UserMacros“
<PropertyGroup Label="UserMacros" />
UserMacros
enthält Eigenschaften, die Sie als Variablen erstellen, die zum Anpassen des Buildprozesses verwendet werden. Sie können beispielsweise ein Benutzermakro definieren, um den benutzerdefinierten Ausgabepfad als „$(CustomOutputPath)“ zu definieren und diesen dafür verwenden, andere Variablen zu definieren. Diese Eigenschaftengruppe enthält diese Eigenschaften. In Visual Studio wird diese Gruppe nicht in der Projektdatei aufgefüllt, da Visual C++ Benutzermakros für Konfigurationen nicht unterstützt. Benutzermakros werden in Eigenschaftenblättern unterstützt.
PropertyGroup-Elemente pro Konfiguration
<PropertyGroup />
Es gibt mehrere Instanzen dieser Eigenschaftengruppe: eine pro Konfiguration für alle Projektkonfigurationen. Jeder Eigenschaftengruppe muss eine Konfigurationsbedingung angefügt sein. Wenn eine Konfiguration fehlt, funktioniert das Dialogfeld Projekteigenschaften nicht ordnungsgemäß. Im Gegensatz zu den zuvor aufgeführten Eigenschaftengruppen verfügt dies nicht über eine Bezeichnung. Diese Gruppe enthält Einstellungen auf Projektkonfigurationsebene. Diese Eigenschaften gelten für alle Dateien, die Teil der angegebenen Elementgruppe sind. Elementdefinitionsmetadaten für die Buildanpassung werden hier initialisiert.
Diese PropertyGroup muss folgen <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
, und es darf keine andere PropertyGroup ohne Bezeichnung vorhanden sein , bevor sie angezeigt wird (andernfalls funktioniert die Bearbeitung von Project-Eigenschaften nicht ordnungsgemäß).
ItemDefinitionGroup-Elemente pro Konfiguration
<ItemDefinitionGroup />
Enthält Elementdefinitionen. Diese Definitionen müssen den gleichen Bedingungen entsprechen wie die Bezeichnungs-weniger pro Konfigurationselemente PropertyGroup
.
ItemGroup-Elemente
<ItemGroup />
ItemGroup
elemente enthalten die Elemente (Quelldateien usw.) im Projekt. Bedingungen werden für Project-Elemente nicht unterstützt (d. h. Elementtypen, die als Projektelemente anhand von Regeldefinitionen behandelt werden).
Die Metadaten sollten über Konfigurationsbedingungen für jede Konfiguration verfügen, auch wenn sie alle gleich sind. Zum Beispiel:
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</TreatWarningAsError>
<TreatWarningAsError Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</TreatWarningAsError>
</ClCompile>
</ItemGroup>
Das Visual Studio C++-Projektsystem unterstützt derzeit keine Wildcards in Projektelementen.
<ItemGroup>
<ClCompile Include="*.cpp"> <!--Error-->
</ItemGroup>
Das Visual Studio C++-Projektsystem unterstützt derzeit keine Makros in Projektelementen.
<ItemGroup>
<ClCompile Include="$(IntDir)\generated.cpp"> <!--not guaranteed to work in all scenarios-->
</ItemGroup>
Verweise werden in einem ItemGroup-Element angegeben und haben folgende Einschränkungen:
Verweise unterstützen keine Bedingungen.
Verweise auf Metadaten unterstützen keine Bedingungen.
Import-Element „Microsoft.Cpp.targets“
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
Definiert (direkt oder über Importe) C++-Ziele wie Build, Bereinigen usw.
ImportGroup-Element „ExtensionTargets“
<ImportGroup Label="ExtensionTargets" />
Diese Gruppe enthält Importe für die Zieldateien der Buildanpassung.
Folgen einer falschen Sortierung
Die Visual Studio-IDE hängt von der Zuvor beschriebenen Sortierung der Projektdatei ab. Wenn Sie beispielsweise einen Eigenschaftswert auf den Eigenschaftenseiten definieren, platziert die IDE die Eigenschaftsdefinition generell in der Eigenschaftengruppe mit der leeren Bezeichnung. Durch diese Sortierung wird sichergestellt, dass die in den Systemeigenschaftenblättern enthaltenen Standardwerte durch benutzerdefinierte Werte überschrieben werden. Ebenso werden die Zieldateien am Ende importiert, da sie die zuvor definierten Eigenschaften nutzen und da sie im Allgemeinen keine Eigenschaften selbst definieren. Ebenso werden Benutzereigenschaftenblätter nach den Systemeigenschaftenblättern importiert (eingeschlossen von Microsoft.Cpp.props
). Diese Reihenfolge stellt sicher, dass der Benutzer alle Standardwerte außer Kraft setzen kann, die von den Systemeigenschaftenblättern bereitgestellt werden.
Wenn eine .vcxproj
Datei diesem Layout nicht folgt, sind die Buildergebnisse möglicherweise nicht das, was Sie erwarten. Wenn Sie z. B. versehentlich ein Systemeigenschaftenblatt nach den vom Benutzer definierten Eigenschaftenblättern importieren, werden die Benutzereinstellungen von den Systemeigenschaftenblättern außer Kraft gesetzt.
Selbst die IDE-Entwurfszeit hängt teilweise von der korrekten Anordnung von Elementen ab. Wenn ihre .vcxproj
Datei beispielsweise nicht über die PropertySheets
Importgruppe verfügt, kann die IDE möglicherweise nicht ermitteln, wo ein neues Eigenschaftenblatt platziert werden soll, das der Benutzer im Eigenschaften-Manager erstellt hat. Dies kann dazu führen, dass ein Benutzerblatt von einem Systemblatt überschrieben wird. Obwohl die von IDE verwendete Heuristik kleinere Inkonsistenzen im .vcxproj
Dateilayout tolerieren kann, empfehlen wir dringend, dass Sie nicht von der struktur abweichen, die weiter oben in diesem Artikel gezeigt wird.
Verwendung von Elementbezeichnungen durch die IDE
Wenn Sie in der IDE die UseOfAtl-Eigenschaft auf der allgemeinen Eigenschaftenseite festlegen, wird sie in die Konfigurationseigenschaftengruppe in der Projektdatei geschrieben. Die TargetName-Eigenschaft auf derselben Eigenschaftenseite wird in die Eigenschaftsgruppe ohne Bezeichnung pro Konfiguration geschrieben. Visual Studio sucht in der XML-Datei der Eigenschaftenseite nach Informationen dazu, wohin jede Eigenschaft geschrieben werden soll. Für die Allgemeine Eigenschaftsseite, vorausgesetzt, Sie verfügen über eine englische Version von Visual Studio 2019 Enterprise Edition, ist %ProgramFiles(x86)%\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\VCTargets\1033\general.xml
diese Datei . Die XML-Regeldatei der Eigenschaftenseite definiert die statischen Informationen einer Regel und deren Eigenschaften. Eine dieser Informationen ist die bevorzugte Position einer Regeleigenschaft in der Zieldatei (die Datei, in die deren Wert geschrieben wird). Die bevorzugte Position wird vom Label-Attribut in den Elementen der Projektdatei angegeben.
Layout von Eigenschaftenblättern
Der folgende XML-Codeausschnitt stellt das minimale Layout einer Eigenschaftenblattdatei (.props) dar. Es ähnelt einer .vcxproj
Datei, und die Funktionalität der .props
Elemente kann aus der vorherigen Diskussion abgeleitet werden.
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup />
</Project>
Um ein eigenes Eigenschaftenblatt zu erstellen, kopieren Sie eine der .props
Dateien im VCTargets
Ordner, und ändern Sie es für Ihre Zwecke. Für Visual Studio 2019 Enterprise Edition ist %ProgramFiles%\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\VCTargets
der Standardpfad VCTargets
.
Siehe auch
Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio
Eigenschaftenseite: XML-Dateien
.vcxproj
-Dateien und -Platzhalter