3

我学会了如何编辑我的 .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 文件中所做的任何事情都不会产生影响,这不仅会在下次保存项目时被覆盖。

4

1 回答 1

1

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

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

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

当所有文件都单独包含而不使用全局**\*.cpp参数时,控制项目会容易得多。我怀疑是否正确解析和使用Exclude="BufferTrio.cpp;GraphicsFacade.cpp;"了与 on MSBuild 属性一起使用的属性。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>

最后,可以创建构建任务,该任务将根据文件创建或提交到 repo 的日期划分文件,并根据比较结果将编译器标志应用于它们,即

<CLCompile Include="BufferTrio.cpp;">
  <AdditionalOptions Condition="$(BufferTrioCppCreatedDate) >= $(NumericDateTimeFlagThreshold)">%(AdditionalOptions)</AdditionalOptions>
</CLCompile>
于 2017-11-06T23:31:14.053 回答