簡體   English   中英

VS2017:如何在不破壞我設置的過濾器的情況下在.vcxproj中編寫每個文件選項?

[英]VS2017: How can I write per-file options in .vcxproj, without breaking the filters I've set up?

我學會了如何編輯我的.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文件中所做的任何事情都不會產生差異,這不僅在下次項目保存時被覆蓋。

有兩個問題可能是導致此行為的原因。

首先,當您需要對項目構建進行細粒度控制時,我會避免使用以下模式:

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

最后,可以創建構建任務,該任務將根據文件創建或提交到repo的日期划分文件,並根據比較結果將其應用於編譯器標記,即

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM