2017-11-01 1 views
2

Ich habe gelernt, wie man meine .vcxproj Datei bearbeitet, um einige Dateien mit/Za und einige ohne zu kompilieren.VS2017: Wie kann ich in .vcxproj Optionen pro Datei schreiben, ohne die Filter zu brechen, die ich eingerichtet habe?

Es scheint jedoch, dass seit dem Hinzufügen von Elementen zur .vcxproj-Datei die Filter, die ich in der IDE eingerichtet habe, durcheinander kommen, während die .vcxproj.filters-Datei sich in ein viel größeres Durcheinander von Triple verwandelt , vierfache, nicht arbeitende Duplikate, die bei jedem Speichern weitere Duplikate schreiben.

Wie kann ich eine Compiler-Option (wie/Za) festlegen, um automatisch auf alle neuen Dateien anzuwenden, aber nicht auf einige alte Dateien, und trotzdem funktionieren die Filter ordnungsgemäß? Hier

ist ein verkürzter Beispiel dafür, was ich hinzugefügt, um meine .vcxproj Datei:

<ItemGroup> 
    <CLCompile Include="**\*.cpp;" Exclude="BufferTrio.cpp;GraphicsFacade.cpp;"> 
     <AdditionalOptions>/Za %(AdditionalOptions)</AdditionalOptions> 
    </CLCompile> 
    <CLCompile Include="BufferTrio.cpp;GraphicsFacade.cpp;"> 
     <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions> 
    </CLCompile> 
    </ItemGroup> 
    <ItemGroup> 
    <None Include="fragmentShader.glsl" /> 
    <None Include="vertexShader.glsl" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Text Include="Notes.txt" /> 
    <Text Include="Todo.txt" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ClInclude Include="BufferTrio.h" /> 
    <ClInclude Include="Exceptions.h" /> 
    <ClInclude Include="FileUtils.h" /> 
    <ClInclude Include="GraphicsFacade.h" /> 
    </ItemGroup> 

Dieses seltsamerweise alle H-Dateien in den richtigen Filter setzen, aber alle CPP/c-Dateien im Projekt Wurzel, außerhalb aller Filter.

Nichts, was ich in der IDE oder mit der Datei .vcxproj.filters mache, macht einen Unterschied, der nicht nur beim nächsten Speichern des Projekts überschrieben wird.

Antwort

0

Es gibt zwei Probleme, die eine Ursache für dieses Verhalten sein können.

Zunächst möchte ich mit folgendem Muster vermeiden, wenn Sie eine feinkörnige Kontrolle über Projekterstellungs müssen:

<CLCompile Include="**\*.cpp;" Exclude="BufferTrio.cpp;GraphicsFacade.cpp;"> 
     <AdditionalOptions>/Za %(AdditionalOptions)</AdditionalOptions> 
    </CLCompile> 
    <CLCompile Include="BufferTrio.cpp;GraphicsFacade.cpp;"> 
     <AdditionalOptions>%(AdditionalOptions)</AdditionalOptions> 
    </CLCompile> 

Es ist viel einfacher Projekt zu steuern, wenn alle Dateien diese einzeln enthalten sind, ohne die Verwendung von Globbing **\*.cpp Argumente. Ich bezweifle, dass die Verwendung des Attributs Exclude="BufferTrio.cpp;GraphicsFacade.cpp;" gemeinsam mit Include="**\*.cpp;" auf MSBuild-Eigenschaft ordnungsgemäß analysiert und verwendet wird.

Zweitens ist es am besten, zwei <ItemGroup></ItemGroup> Knoten zu erstellen, um unabhängig neue und alte Dateien zu steuern und ihnen verschiedene Compiler-Flags zuzuweisen.

Drittens können Sie explizite <project-name>.vcxproj.filters Projektdatei erstellen, in der Filterung kann für beide Quellen und Header mit einer Datei Granularität dh definiert werden:

<?xml version="1.0" encoding="UTF-8"?> 
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\alloc.cpp"> 
     <Filter>Source Files</Filter> 
    </ClCompile> 
    <ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\assertionprop.cpp"> 
     <Filter>Source Files</Filter> 
    </ClCompile> 
    <ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\bitset.cpp"> 
     <Filter>Source Files</Filter> 
    </ClCompile> 
    </ItemGroup> 
    <ItemGroup> 
    <Filter Include="Source Files"> 
     <UniqueIdentifier>{3E79A5A2-A53A-3F44-8869-13CB1954DF36}</UniqueIdentifier> 
    </Filter> 
    </ItemGroup> 
</Project> 

Schließlich ist es möglich, Build-Task zu erstellen, welche Dateien aufteilen würde basierend an dem Datum, an dem sie erstellt oder zum Repo-Commit verpflichtet wurden und das Compiler-Flag auf der Grundlage des Vergleichsergebnisses, z. B.

Verwandte Themen