如何使 Visual Studio 2015 C++ 项目与 Visual Studio 2010 兼容?

How do I make a Visual Studio 2015 C++ project compatible with Visual Studio 2010?

学校要求我的老师使用 Visual Studio 2010,因为他们不想安装任何新东西。我一直在使用 Visual Studio 2015,我非常喜欢它。然而,当她尝试 运行 任何代码时,它会产生一堆错误。我尝试了一种通过编辑解决方案文件使 2013/2012 项目与 2010 兼容的解决方案,但它仍然会产生错误。有解决办法吗?

这是我尝试 运行 Visual Studio 2010 中的源文件时的控制台输出:

1>------ Build started: Project: typingSalon, Configuration: Debug Win32 ------
1>Build started 4/8/2015 8:19:30 AM.
1>Project file contains ToolsVersion="14.0". This toolset is unknown or missing. You may be able to resolve this by installing the appropriate .NET Framework for this toolset. Treating the project as if it had ToolsVersion="4.0".
1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(518,5): error MSB8008: Specified platform toolset (v140) is not installed or invalid. Please make sure that a supported PlatformToolset value is selected.
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.05
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

问题是项目文件引用了 v140 C++ 工具集,这基本上意味着使用 Visual Studio 2015 中的 C++ 编译器。此编译器未安装,导致您的错误消息。

根据我的想法,有两种方法可以让你克服你的处境:

  • 在您的计算机上安装 Visual Studio 2010。然后,从 2015 年开始,select 项目设置中的 2010 平台工具集。然后,您的项目将始终使用 2010 进行编译,但您的优势是不会意外使用 2010 没有的 C++ 功能。

  • 不要在您的计算机上安装 Visual Studio 2010,而是使用第二台计算机(仅安装 2010)创建第二个构建配置,其平台工具集设置为 Visual Studio 2010 (v100)。根据您使用的 Visual Studio 使用适当的配置。

这两种解决方案基本上都意味着您不使用 Visual Studio 2015 的 C++ 功能优于 Visual Studio 2010,这有点不幸。

更新 Visual Studio 2017、2019 和 2022

如果您只使用 Visual Studio IDE 本身(而不是命令行上的 MSBuild)进行编译,则只需进行一些更改,您就可以实际完成这项工作,或多或少地完成两个平台上的功能。

不幸的是,C++ 项目的规则与 C#/.NET 不同,需要一些手动干预,这与 C# 项目不同,C# 项目在项目“升级”后相当自动地进行往返。这些更改需要手动编辑项目文件。

Visual Studio 的更高版本将在构建 运行 到 IDE 时覆盖工具版本。只需将 ToolsVersion 设置为 4.0,以满足 Visual Studio 2010,然后将 PlatformToolset 固定在一个公共 属性 组中,即可在 Visual Studio 中获得正确的默认操作2015年IDE大概会做到

设置 PlatformToolset 的原因是为了在更改构建属性时正确设置默认值,例如当您转到 IDE 中的 DebugRelease 设置时并选择 <inherit from parent or project defaults> 你将默认获得 2015 版本而不是 2010.

与Visual Studio2010、2015、2017、2019、2022的C++项目文件共存步骤:

  1. ToolsVersion 属性为 4.0
  2. 为 Visual Studio 2015
  3. 将 PlatformToolset 的通用默认值添加到 v140
  4. 为 Visual Studio 2017
  5. 将 PlatformToolset 的通用默认值添加到 v141
  6. 为 Visual Studio 2019
  7. 将 PlatformToolset 的通用默认值添加到 v142
  8. 为 Visual Studio 2022
  9. 将 PlatformToolset 的通用默认值添加到 v143
  10. 保存文件并重新加载项目

1.工具版本到 4.0:

<?xml version="1.0" encoding="utf-8"?>
  <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup Label="ProjectConfigurations">
      <ProjectConfiguration Include="Debug|Win32">
        <Configuration>Debug</Configuration>
        <Platform>Win32</Platform>
      ...

通过在 ToolsVersionProject 标签中仅将 14.0 更改为 4.0 它变成

<?xml version="1.0" encoding="utf-8"?>
  <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup Label="ProjectConfigurations">
      <ProjectConfiguration Include="Debug|Win32">
        <Configuration>Debug</Configuration>
        <Platform>Win32</Platform>
      ...

2。将 PlatformToolset 的通用默认值添加到仅被 Visual Studio 2015 识别的 v140:

  <PropertyGroup Label="Globals">
    <ProjectGuid>{12345678-9876-ABCD-DCCA-765FE987AA1F}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>myProject</RootNamespace>
    <TargetPlatformVersion>8.1</TargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

通过仅将新的 PlatformToolset 行添加到 PropertyGroup 的底部,它变成:

  <PropertyGroup Label="Globals">
    <ProjectGuid>{12345678-9876-ABCD-DCCA-765FE987AA1F}</ProjectGuid>
    <Keyword>Win32Proj</Keyword>
    <RootNamespace>myProject</RootNamespace>
    <TargetPlatformVersion>8.1</TargetPlatformVersion>
    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
    <PlatformToolset Condition="'$(VisualStudioVersion)' == '16.0'">v142</PlatformToolset>
    <PlatformToolset Condition="'$(VisualStudioVersion)' == '17.0'">v143</PlatformToolset>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

要在 Visual Studio 2017 中加载,还需要包含工具集 v141 的一行,如上所示,以继续在所有三个项目之间无缝交叉加载项目。

在 Visual Studio 2019 年,如上所示,额外需要一条带有工具集 v142 的线路,以继续在所有四个项目之间无缝交叉加载项目。

为 premake5 写一个 .lua 脚本 - https://premake.github.io/ 如何在这里找到:https://github.com/premake/premake-core/wiki

然后从命令行使用 visual studio 版本简单地为特定的 visual studio 创建项目 - 例如像这样:

premake5 --file=myproject.lua vs2015
premake5 --file=myproject.lua vs2010

典型的脚本如下所示:

-- If visual studio version is not specified from command line - use vs2013
if _ACTION == nil then
    _ACTION = "vs2013"
end

buildvsver = _ACTION

--
-- I typically use "_vs2013" suffix so autogenerated projects won't conflict with each other.
--
solution ( "MyOwnSolution" .. "_" .. buildvsver)
    platforms {  "x32", "x64" }
    configurations { "Debug", "Release" }
    objdir (  "obj/" .. buildvsver)

project ("MyOwnProject" .. "_" .. buildvsver)
    kind     "SharedLib"                -- http://industriousone.com/kind: ConsoleApp | SharedLib | StaticLib | WindowedApp
    platforms {  "x32", "x64" }
    language "C++"
    targetdir ("bin/%{cfg.buildcfg}_%{cfg.platform}_" .. buildvsver)

    -- If you use managed code
    flags { "Managed" }

    flags { "MFC" }
    flags { "Unicode" }

    -- Add dependency on another project:
    -- dependson { "OtherProject" .. "_" .. buildvsver }

    -- If you use managed code - you can specify .net framework version.
    framework "4.0"

    files {
        "mysource1.cpp",
        "myheader1.h",
        "myheader2.cpp",
    }

    links {
        -- Some of dependent libraries
        "dbghelp.lib",
        "delayimp.lib"
    }

    -- Force to delay load some .dll
    -- Custom / advanced flags.
    linkoptions { "/delayload:dbghelp.dll " }
    linkoptions { "/delayload:mscoree.dll " }

    configuration "*"
        -- I typically use 'ReleaseRuntime' - that's debug = release configuration. 
        -- No special .dll's are needed even for debug version of your application
        flags { "NoRuntimeChecks", "ReleaseRuntime" }

        -- Debug symbols.
        flags { "Symbols" }

        -- Executable name without _vs2013 prefix.
        targetname ( "MyOwnProject" )

        -- C++ defines for both - release and debug configurations.
        defines { "NDEBUG", "_CRT_SECURE_NO_WARNINGS", "WIN32", "WINVER=0x0600", "_WIN32_WINNT=0x0600" }

        -- debugcommand "customExeToLaunch.exe"

        -- Custom post build steps.
        -- postbuildcommands { "call $(ProjectDir)projexport.bat $(PlatformName) $(TargetPath)" }

    configuration "Release"
        -- Only difference from debug - is optimizations for speed.
        optimize "Speed"

        -- Can debug in release.

        --
        -- Enhance Optimized Debugging
        -- https://randomascii.wordpress.com/2013/09/11/debugging-optimized-codenew-in-visual-studio-2012/
        -- https://msdn.microsoft.com/en-us/library/dn785163.aspx
        --
        buildoptions { "/Zo" }


project ("TestMyProject" .. "_" .. buildvsver)
    platforms {  "x32", "x64" }
    kind     "ConsoleApp"
    language "C#"
    targetdir ("bin/%{cfg.buildcfg}_%{cfg.platform}_" .. buildvsver)
    framework "4.0"

    links {
        "System",
        "System.Core",
        "System.Data",
        "System.Drawing",
        "System.Windows.Forms",
        "System.Xml",
        "MyOwnProject" .. "_" .. buildvsver
    }

    files    { 
        "TestMyProject.cs",
    }

    configuration "*"
        targetname ( "TestMyProject" )
        flags { "Symbols" }
        defines { "DEBUG" }

在你对事情的工作原理有了某种理解之后——你甚至可以为 .lua 本身创建它自己的自定义构建步骤来启动 premake5,甚至自定义项目生成——比如创建 lua 功能,可以帮助您进行更高级的项目。

请注意,我使用了很多您可能不需要的高级内容(我的大部分项目都针对 64 位和 32 位 cpu 进行编译,等等...)-从零开始可能比复制我显示的配置更有意义。然后你就会明白事情是如何运作的。