12 Stimmen

Wie kann man globale Einstellungen in einer Lösung in VC++ definieren?

Ich habe eine Reihe von Lösungen mit einer großen Anzahl von Projekten in ihnen. Ich würde gerne globale Einstellungen für die Lösung definieren können, die von allen Projekten verwendet werden. Zum Beispiel ein Include-Verzeichnis. Ich möchte in der Lage sein, das Include-Verzeichnis an einer Stelle für alle Projekte in den Lösungen zu ändern.

Als ich nach einer Lösung suchte, fand ich eine gute Beschreibung des Problems, die entspricht genau meiner aber die dort vorgeschlagene Lösung, Projekteigenschaftsblätter, sind pro Projekt und nicht pro Lösung definiert.

Ich könnte Umgebungsvariablen oder Visual Studio-Einstellungen verwenden, aber dann muss jeder, der den Code kompilieren muss, genau dieselben Einstellungen festlegen.

Kann jemand einen Vorschlag machen, wie man das machen kann? Danke!

15voto

Stephen W. Carson Punkte 186

Zu diesem Zweck verwenden wir Eigenschaftsblätter. Ein einziges Eigenschaftsblatt kann allen Projekten in der Lösung zugewiesen werden. Von da an können Sie eine Einstellung in diesem einen Eigenschaftsblatt ändern, die sich auf alle Projekte auswirkt.

Tipp für Fortgeschrittene: Wir verwenden tatsächlich mehrere Eigenschaftsblätter (z. B. eines für Release-Zieltypen, eines für Debug-Zieltypen). Der Tipp ist, dass die Reihenfolge sehr wichtig ist. Wenn Sie die Projektdateien von Hand bearbeiten, setzt das letzte Eigenschaftsblatt die Einstellungen in den vorherigen Eigenschaftsblättern in der Liste außer Kraft. Wenn Sie das Projekt in der grafischen Benutzeroberfläche bearbeiten, überschreibt das oberste die darunter liegenden.

2voto

jwfearn Punkte 27520

Wie bereits von anderen vorgeschlagen, können Sie mit Immobilienblättern machen, was Sie wollen. Der Trick ist die Verwendung von InheritedPropertySheets wie bei der Verwendung von #include in C++. HINWEIS: Das XML ist für Projektdateien und Eigenschaftsblattdateien leicht unterschiedlich. Hier ist ein erfundenes und vereinfachtes Beispiel für zwei Projekte ( prjA.vcproj y prjB.vcproj ) mit demselben Eigenschaftsblatt ( sln.vsprops ), die ihrerseits eine weitere ( strict.vsprops ):

strict.vsprops

<VisualStudioPropertySheet ...>
    <Tool Name="VCCLCompilerTool" WarningLevel="3" WarnAsError="true"/>
</VisualStudioPropertySheet>

sln.vsprops

<VisualStudioPropertySheet ... InheritedPropertySheets=".\strict.vsprops">
    <Tool
        Name="VCCLCompilerTool"
        PreprocessorDefinitions="NOMINMAX=1"
        RuntimeTypeInfo="true"
    />
</VisualStudioPropertySheet>

prjA.vcproj

<VisualStudioProject ...>
    <Configurations>
        <Configuration ... InheritedPropertySheets=".\sln.vsprops">
        </Configuration>
    </Configurations>
    ...
</VisualStudioProject>

prjB.vcproj

<VisualStudioProject ...>
    <Configurations>
        <Configuration ... InheritedPropertySheets=".\sln.vsprops">
        </Configuration>
    </Configurations>
    ...
</VisualStudioProject>

Sie können auch Folgendes finden diese Frage und seine Antworten nützlich.

1voto

Arnout Punkte 2750

Vielleicht könnten Sie eine MSBuild-Datei zu Ihrer Lösung hinzufügen, in der Sie eine Reihe von gemeinsamen Eigenschaften definieren, und dann <Import> diese Datei in alle Ihre echten Projekte?

Das heißt, dass Sie in Ihrer MSBuild-Datei "Einstellungen" eine Reihe von Eigenschaften definieren:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <WinUnitIncludeDir>C:\Includes\WinUnit</WinUnitIncludeDir>
        <!-- Other shared properties go here -->
    </PropertyGroup>
</Project>

Bei Ihren realen Projekten können Sie sich dann darauf beziehen:

<Project ...>
    ...
    <Import Project="path/to/settings.msbuild" />
    ...
    <Configurations>
        <Configuration ...>
            <Tool Name="VCCLCompilerTool"
                  ...
                  AdditionalIncludeDirectories="$(WinUnitIncludeDir)"
                  ... />
            ...
        ...
    ...
</Project>

1voto

Xavier Nodet Punkte 4883

Wie vorgeschlagen, sollten Sie sich die Eigenschaftsblätter (auch .vsprops-Dateien genannt) ansehen.
Ich habe eine sehr kurze Einführung zu diesem Feature geschrieben aquí .

0voto

Klaim Punkte 63705

Ich habe vor einiger Zeit genau das Gleiche gesucht, aber nicht genau das gefunden, was ich wollte.

Das Einzige, was dieser Funktion nahe kommen könnte, sind Eigenschaftsblätter . Das ist nicht gerade global, da es einem Projekt gehört und von anderen genutzt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X