【问题标题】:How to have global settings defined in a solution in VC++?如何在 VC++ 的解决方案中定义全局设置?
【发布时间】:2008-12-18 06:51:27
【问题描述】:

我有许多解决方案,其中包含大量项目。我希望能够为所有项目使用的解决方案定义全局设置。例如包含目录。我希望能够在一个地方为解决方案中的所有项目更改包含目录。

当我搜索解决方案时,我找到了一个很好的问题描述 matches mine exactly 但那里建议的解决方案,项目属性表,是按项目定义的,而不是按解决方案定义的。

我可以使用环境变量或 Visual Studio 设置,但是需要编译代码的每个人都必须定义完全相同的设置。

谁能建议一种方法来做到这一点?谢谢。

【问题讨论】:

    标签: visual-studio visual-c++ visual-studio-2008


    【解决方案1】:

    我们使用属性表来实现这一点。可以将单个属性表分配给解决方案中的所有项目。从那时起,您可以更改该属性表中的设置,它将影响所有项目。

    高级提示:我们实际上使用了多个属性表(例如,一个用于发布目标类型,一个用于调试目标类型)。提示是顺序非常重要。如果您手动编辑项目文件,则最后一个属性表将覆盖列表中先前属性表中的设置。如果您在 GUI 中进行编辑,则 TOP 会覆盖其下方的。

    【讨论】:

      【解决方案2】:

      正如其他人所建议的,属性表可以做你想做的事。诀窍是使用InheritedPropertySheets,就像在C++ 中使用#include。注意:项目文件和属性表文件的 XML 略有不同。这是两个项目(prjA.vcprojprjB.vcproj)的人为设计的简化示例,其中包括同一个属性表(sln.vsprops),而该属性表本身又包含另一个(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>
      

      您可能还会发现this question 及其答案很有用。

      【讨论】:

        【解决方案3】:

        也许您可以将一个 MSBuild 文件添加到您定义许多共享属性的解决方案中,然后将 <Import> 该文件添加到您的所有实际项目中?

        也就是说,在您的“设置”MSBuild 文件中,您定义了许多属性:

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

        从你的实际项目中,你可以参考这个:

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

        【讨论】:

        • Visual C++ 2008 不使用 MSBuild(它使用 VCBuild),但您可以按照@Stephen W. Carson 的建议对属性文件使用类似的技术。 Visual C++ 2010 将使用 MSBuild。
        【解决方案4】:

        按照建议,您应该查看属性表(又名 .vsprops 文件)。
        我写了一篇关于这个功能的简短介绍here

        【讨论】:

          【解决方案5】:

          我前段时间搜索了完全相同的东西,但没有找到我想要的东西。

          唯一可能接近此功能的是Property Sheets。这并不完全是全球性的,因为它由一个项目拥有并被其他人使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多