【问题标题】:VS not honoring PropertyGroup Configuration SettingsVS 不遵守 PropertyGroup 配置设置
【发布时间】:2016-10-04 09:01:11
【问题描述】:

我正在尝试压缩一个 XML 项目文件。该项目编译单个源文件,但其大小超过 11 KB,因为喜欢多次复制相同的设置。我正在尝试移动每个源文件的设置,并使用不同的条件语句或表达式将它们提升到 Configuration PropertyGroup 中(XML 怎么称呼它们?)。

如果我正确解析来自 MSDN 博客的A guide to .vcxproj and .props file structure,我们可以将设置放在属性组中:

<PropertyGroup Label=“Configuration“ />

  <!– This property sheet (directly or via imports) defines the

  default values for many tool-specific properties such as the

  compiler’s Optimization, WarningLevel properties, Midl tool’s

  TypeLibraryName property, etc...

但是,当我通过关闭 VS 并使用修改后的项目文件重新打开它来检查我的修改时,没有任何设置被拾取。 Visual Studio 似乎在使用自己的设置。

我有几个问题:

  1. 是否有 Visual Studio 设置来告诉它停止将每个设置写入每个源文件?没有理由为跨入每个配置的每个源文件复制 175x4 次设置。

  2. Visual Studio 是否有压缩实用程序,因此我不必手动执行此操作?这是一项非常乏味的工作。

  3. 为什么 Visual Studio 没有选择设置?我该如何解决?


这是一个包含预处理器宏的属性页的屏幕截图。修改后的 XML 有以下内容,在 Visual Studio 中没有体现。我试过使用和不使用ClCompile

<!-- Debug Configurations -->
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Release Configuration">
  <ClCompile>  
    <PreprocessorDefinitions>CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    ...
  </ClCompile>    
</PropertyGroup>


这是压缩后的项目文件。 original can be found here。该项目编译了 1 个源文件,其大小超过 11KB 未压缩。

我的模组从&lt;!-- All Configurations --&gt; 开始,到&lt;!-- Back to Visual Studio boilerplate --&gt; 结束。我还没有完成所有设置的提升,但是已经完成的设置,例如预处理器宏和运行时库,并没有反映在 Visual Studio 下。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup Label="Globals">
    <ProjectGuid>{1974a53a-9863-41c9-886d-b2b8c2fc3c8b}</ProjectGuid>
    <RootNamespace>dlltest</RootNamespace>
    <PlatformToolset>v100</PlatformToolset>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

  <!-- All Configurations -->
  <PropertyGroup Label="Configuration">
    <ConfigurationType>Application</ConfigurationType>
    <UseOfMfc>false</UseOfMfc>
    <CharacterSet>MultiByte</CharacterSet>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <OutDir>$(Platform)\DLL_Output\$(Configuration)\</OutDir>
    <IntDir>$(Platform)\$(ProjectName)\$(Configuration)\</IntDir>
    <ClCompile>
      <WarningLevel>Level4</WarningLevel>
      <CallingConvention>StdCall</CallingConvention>
      <SuppressStartupBanner>true</SuppressStartupBanner>
    </ClCompile>      
  </PropertyGroup>

  <!-- Debug Configurations -->
  <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Debug Configuration">
    <ClCompile>  
      <PreprocessorDefinitions>CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Optimization>Disabled</Optimization>
      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
    </ClCompile>      
  </PropertyGroup>

  <!-- Release Configurations -->
  <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Release Configuration">
    <ClCompile>
      <PreprocessorDefinitions>NDEBUG;CRYPTOPP_DLL_ONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <OmitFramePointers>true</OmitFramePointers>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
    </ClCompile>
  </PropertyGroup>

  <!-- X86 Configurations -->
  <PropertyGroup Condition="'$(Platform)'=='Win32'" Label="X86 Configuration">
    <ClCompile>
      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
    </ClCompile>    
  </PropertyGroup>

  <!-- X64 Configurations -->
  <PropertyGroup Condition="'$(Platform)'=='x64'" Label="X64 Configuration">
    <ClCompile>
      <!-- <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet> -->
      <EnableEnhancedInstructionSet>StreamingSIMDExtensions</EnableEnhancedInstructionSet>
    </ClCompile>    
  </PropertyGroup>

  <!-- Back to Visual Studio boilerplate -->
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />

  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <StringPooling>true</StringPooling>
      <PrecompiledHeader />
    </ClCompile>
    <ResourceCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Culture>0x0409</Culture>
    </ResourceCompile>
    <Link>
      <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies>
      <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <StringPooling>true</StringPooling>
      <PrecompiledHeader />
    </ClCompile>
    <ResourceCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Culture>0x0409</Culture>
    </ResourceCompile>
    <Link>
      <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies>
      <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
      <TargetMachine>MachineX64</TargetMachine>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <PrecompiledHeader />
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
    </ClCompile>
    <ResourceCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Culture>0x0409</Culture>
    </ResourceCompile>
    <Link>
      <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies>
      <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <PrecompiledHeader />
      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
    </ClCompile>
    <ResourceCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Culture>0x0409</Culture>
    </ResourceCompile>
    <Link>
      <AdditionalDependencies>cryptopp.lib;Ws2_32.lib</AdditionalDependencies>
      <AdditionalLibraryDirectories>$(Platform)\DLL_Output\$(Configuration)</AdditionalLibraryDirectories>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <SubSystem>Console</SubSystem>
      <TargetMachine>MachineX64</TargetMachine>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="dlltest.cpp" />
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>

【问题讨论】:

    标签: visual-studio msbuild projects-and-solutions


    【解决方案1】:

    您的设置被覆盖,因为您将它们放在文件中的时间过早。像 VS 那样做,把它们放在&lt;Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /&gt;之后。

    更新我的错误;乍一看,您的设置没有任何效果,因为您将它们定义为属性。像 VS 那样做,并在 ItemDefinitionGroup 而不是 PropertyGroup 中定义它们(同样,根据 msbuild 评估规则在正确的位置)

    至于压缩:将您的设置存储在单独的属性表中并导入它们。如果组织得当,这将允许您不再需要编辑项目文件设置本身(因此 VS 填充的 ItemDefinitionGroups 将为空),但您只需根据需要添加/删除属性表,项目文件只是一个容器用于源/头文件和属性表。如果您在 VS gui(称为“属性管理器”)中进行导入,它们将自动出现在前面提到的正确位置,并且顺序也可以。它们也可以在 VS 中通过与项目相同的选项对话框进行编辑。

    请注意,您可以创建导入其他属性表的整个层次结构,这有助于避免重复。例如。而不是手动将 Ws2_32.lib 添加到每个配置/平台组合中,您只需导入一个属性表即可。对于根据平台/配置等具有不同名称的库特别方便。假设您已经为编译器/链接器/...创建了一些单独的标准属性表,您可以将它们添加到“主”表中。示例:

    【讨论】:

    • 谢谢@stijn。 " ... 将它们放在&lt;Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /&gt;..." 之后 - 不幸的是,这也不起作用。我不断移动它们,添加&lt;ClCompile&gt;,删除&lt;ClCompile&gt;,<其他猜测>。真的很不幸,微软没有正确记录这些东西。这完全是在浪费我的时间,因为我现在已经两天了。而且我离正确设置 EnableEnhancedInstructionSet 还差得远,所以 X64 代码的运行速度仍然比 Win32 代码慢。
    • 我敢打赌,鲍尔默在数他的奖金时正在对我大笑。自 2010 年以来,我在四个版本的 Visual Studio 版本上花费了超过 3000 美元,以确保我们能够正确支持它,但我什至无法用这笔钱获得一套像样的文档。相反,我必须来 Stack Overflow 寻求答案。这太荒谬了。
    • 从微软获得 bizspark。最好的 0 美分你 (n) 曾经花过的一切
    • 查看更新:我错过了一个关键部分。关于你的咆哮:我会认为它是一时兴起的,因为它对我来说并没有响起太多的钟声,而且我曾经也开始从完全不同的背景中学习所有这些东西。文档几乎都在那里,尽管我同意可发现性可能并不那么容易。 (就像其他构建系统一样)。但无论如何,您不能认真地期望在 2 天内掌握整个构建系统的全部或部分主要关键点。阅读了解文档然后进行一些实际练习需要时间。
    猜你喜欢
    • 2016-11-30
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多