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