VS2017: Как я могу записать параметры для каждого файла в .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, не имеет значения, которое не просто перезаписывается при следующем сохранении проекта.

2

Решение

Есть две проблемы, которые могут быть причиной такого поведения.

Во-первых, я бы не использовал следующий шаблон, когда вам нужен детальный контроль над сборкой проекта:

    <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 аргументы. Я сомневаюсь, что с помощью атрибута Exclude="BufferTrio.cpp;GraphicsFacade.cpp;" совместно с Include="**\*.cpp;" свойство MSBuild правильно анализируется и используется.

Во-вторых, лучше всего создать два <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>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]