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

时间:2015-04-08 13:08:40

标签: c++ visual-studio-2010 visual-studio visual-studio-2015

我的老师很想学校使用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 ==========

3 个答案:

答案 0 :(得分:7)

已针对Visual Studio 2017和Visual Studio 2019进行了更新

如果只使用Visual Studio IDE本身(而不是命令行上的MSBuild)进行编译,只需稍加一些更改就可以实现这项工作,并且在两个平台上都有或多或少的完整功能。

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

在通过IDE运行构建时,Visual Studio的更高版本将覆盖工具版本。只需将ToolsVersion设置为4.0,以满足Visual Studio 2010,然后将PlatformToolset修复为公共属性组以在Visual Studio 2015 IDE中获取正确的默认操作,就可以执行此操作。

设置PlatformToolset的原因是在更改构建属性时正确的默认值,例如在IDE中转到DebugRelease设置并选择{{1}时你将默认获得2015版本,而不是2010年。

Visual Studio 2010,Visual Studio 2015,Visual Studio 2017和Visual Studio 2019同步在C ++的同一项目文件中的步骤:

  1. ToolsVersion属性为4.0
  2. 为Visual Studio 2015
  3. 添加PlatformToolset的常用默认值到v140
  4. 为Visual Studio 2017
  5. 添加PlatformToolset的常用默认值为v141
  6. 将VisualT 2019的常见默认值PlatformToolset添加到v142
  7. 保存文件并重新加载项目
  8. <强> 1。工具版本到4.0:

    <inherit from parent or project defaults>

    仅在<?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> ... 的{​​{1}}标记中将14.0更改为4.0,它就变为

    Project

    <强> 2。将PlatformToolset的常见默认值添加到仅由Visual Studio 2015识别的v140:

    ToolsVersion

    只需将新<?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> ... 行添加到 <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

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

    在Visual Studio 2019中,如上所示,还需要一个包含工具集 <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> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 的行,以便继续在所有四个项目之间无缝交叉加载项目。

答案 1 :(得分:4)

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

从我的头脑中,有两种方法可以克服你的情况:

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

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

这两个解决方案基本上都意味着您不会使用Visual Studio 2015的改进C ++功能而不是Visual Studio 2010,这有点不幸。

答案 2 :(得分:0)

为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函数来帮助你进行更高级的项目。 / p>

请注意我使用了许多您可能不需要的高级内容(我的大多数项目都是针对64位和32位cpu进行编译,依此类推......) - 可能从零而不是复制我显示的配置。然后你就会明白事情是如何运作的。