VS2017:如何在不破坏我设置的过滤器的情况下在.vcxproj中编写每个文件选项?

时间:2017-11-01 17:14:01

标签: c++ visual-studio msbuild vcxproj

我学习了如何编辑我的.vcxproj文件,用/ Za编译一些文件,有些文件不用。

然而,似乎因为我在.vcxproj文件中添加元素,我在IDE中设置的过滤器搞砸了,而.vcxproj.filters文件变成了一个更大的三重混乱,四倍,不工作的重复项,每次保存时都会写入更多重复项。

如何设置编译器选项(如/ Za)以自动应用于所有新文件,而不是某些旧文件,并且过滤器仍能正常工作?

以下是我添加到.vcxproj文件中的简要示例:

  <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>
奇怪的是,奇怪的是,将所有.h文件放在正确的过滤器中,但所有过滤器都放在项目根目录下的所有cpp / c文件中。

我在IDE或.vcxproj.filters文件中所做的任何事情都不会产生差异,这不仅会在下次项目保存时被覆盖。

1 个答案:

答案 0 :(得分:0)

有两个问题可能是导致此行为的原因。

首先,当您需要对项目构建进行细粒度控制时,我会避免使用以下模式:

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

当所有文件都单独包含在内而不使用globbing **\*.cpp参数时,控制项目要容易得多。我怀疑正确解析和使用在MSBuild属性上与Exclude="BufferTrio.cpp;GraphicsFacade.cpp;"一起使用属性Include="**\*.cpp;"

其次,最好创建两个<ItemGroup></ItemGroup>个节点来独立控制新旧文件,并向它们应用不同的编译器标志。

第三,您可以创建显式<project-name>.vcxproj.filters项目文件,其中可以为源文件和标题定义过滤,文件粒度为:。

<?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>

最后,可以创建构建任务,根据创建或提交回购的日期划分文件,并根据比较结果将其应用于编译器标记,即

<CLCompile Include="BufferTrio.cpp;">
  <AdditionalOptions Condition="$(BufferTrioCppCreatedDate) >= $(NumericDateTimeFlagThreshold)">%(AdditionalOptions)</AdditionalOptions>
</CLCompile>