如何在Visual Studio 2017和Visual Studio 2019之间为每个项目引用vcxproj.filters和vcxproj.user的一个副本

时间:2019-11-18 17:45:13

标签: visual-studio visual-c++ visual-studio-2017 visual-studio-2019

我在Visual Studio 2017社区版中创建了一个c ++项目,并且已将其打开并与Visual Studio 2019社区版“转换”。 项目文件夹包含:

Main.sln
Main/Main.vcxproj
Main/Main.vcxproj.filters
Main/Main.vcxproj.user

根据Winmerge,转换仅影响Main / Main.vcxproj中的两个值:

<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
...
<PlatformToolset>v141</PlatformToolset>

更改为

<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
...
<PlatformToolset>v142</PlatformToolset>

对于VS2017和VS2019,为大多数或所有这些项目文件维护一个副本,存在哪些选项?

我也想知道:

  • .vcxproj或.sln中是否支持条件?
  • 是否有一种方法可以在一个文件夹路径中明确指向.vcxproj, * .vcxproj.filters和* .vcxproj.user在另一个?

谢谢!

2 个答案:

答案 0 :(得分:0)

希望这对以后有所帮助。

MSBuild supports conditionals defined within the .vcxproj files,可以从可用宏中删除。我还发现,可以通过在文件中进一步向下设置值来替换值。

This example讨论了检查和设置VisualStudioVersion宏。

我找到的解决方案使用DefaultPlatformToolset宏,它对于VS2017是v141,对于VS2019是v142。

Main.vcxproj可以在两种条件下使用此方法:

1)在包含必要值的PropertyGroup周围使用“选择”,“何时”和“否则”标签:

<Choose>
  <When Condition="'$(DefaultPlatformToolset)'=='v141'">
    <PropertyGroup Label="Globals">
      <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
    </PropertyGroup>
    <PropertyGroup Label="Configuration">
      <PlatformToolset>v141</PlatformToolset>
    </PropertyGroup>
  </When>
  <When Condition="'$(DefaultPlatformToolset)'=='v142'">
    <PropertyGroup Label="Globals">
      <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
    </PropertyGroup>
    <PropertyGroup Label="Configuration">
      <PlatformToolset>v142</PlatformToolset>
    </PropertyGroup>
  </When>
  <Otherwise>
    <PropertyGroup Label="Globals">
      <WindowsTargetPlatformVersion>$(DefaultWindowsSDKVersion)</WindowsTargetPlatformVersion>
    </PropertyGroup>
    <PropertyGroup Label="Configuration">
      <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
    </PropertyGroup>
  </Otherwise>
</Choose>

2)设置属性组的条件属性:

<PropertyGroup Label="Globals">
  <WindowsTargetPlatformVersion>$(DefaultWindowsSDKVersion)</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(DefaultPlatformToolset)'=='v141'" Label="Globals">
  <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(DefaultPlatformToolset)'=='v142'" Label="Globals">
  <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>

另一种方法可能是每个Visual Studio版本都使用.sln文件,并以$(SolutionFileName)宏为基础。

<Choose>
  <When Condition="'$(SolutionFileName)'=='Main_VS2017.sln'">
    ...
  </When>
  <When Condition="'$(SolutionFileName)'=='Main_VS2019.sln'">
    ...
  </When>
</Choose>

答案 1 :(得分:0)

我已使用http://www.markusweimer.com/2016/03/14/visual-c++/中的解决方案将其转换为2015年和2019年。

<!--
    Switch the PlatformToolset based on the Visual Studio Version
-->
<PropertyGroup>
    <!-- Assume Visual Studio 2015 / 14.0 as the default -->
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">14.0</VisualStudioVersion>
</PropertyGroup>
<!-- Visual Studio 2019 (16.0) -->
<PropertyGroup Condition="'$(VisualStudioVersion)' == '16.0'">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseOfMfc>false</UseOfMfc>
    <CharacterSet>MultiByte</CharacterSet>
    <PlatformToolset>v142</PlatformToolset>
</PropertyGroup>
<!-- Visual Studio 2015 (14.0) -->
<PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseOfMfc>false</UseOfMfc>
    <CharacterSet>MultiByte</CharacterSet>
    <PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<!--
    End of: Switch the PlatformToolset based on the Visual Studio Version
-->

像魅力一样工作...