如何使 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 中的 Debug
或 Release
设置时并选择 <inherit from parent or project defaults>
你将默认获得 2015 版本而不是 2010.
与Visual Studio2010、2015、2017、2019、2022的C++项目文件共存步骤:
- ToolsVersion 属性为 4.0
- 为 Visual Studio 2015
将 PlatformToolset 的通用默认值添加到 v140
- 为 Visual Studio 2017
将 PlatformToolset 的通用默认值添加到 v141
- 为 Visual Studio 2019
将 PlatformToolset 的通用默认值添加到 v142
- 为 Visual Studio 2022
将 PlatformToolset 的通用默认值添加到 v143
- 保存文件并重新加载项目
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>
...
通过在 ToolsVersion
的 Project
标签中仅将 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 进行编译,等等...)-从零开始可能比复制我显示的配置更有意义。然后你就会明白事情是如何运作的。
学校要求我的老师使用 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 中的 Debug
或 Release
设置时并选择 <inherit from parent or project defaults>
你将默认获得 2015 版本而不是 2010.
与Visual Studio2010、2015、2017、2019、2022的C++项目文件共存步骤:
- ToolsVersion 属性为 4.0
- 为 Visual Studio 2015 将 PlatformToolset 的通用默认值添加到 v140
- 为 Visual Studio 2017 将 PlatformToolset 的通用默认值添加到 v141
- 为 Visual Studio 2019 将 PlatformToolset 的通用默认值添加到 v142
- 为 Visual Studio 2022 将 PlatformToolset 的通用默认值添加到 v143
- 保存文件并重新加载项目
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>
...
通过在 ToolsVersion
的 Project
标签中仅将 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 进行编译,等等...)-从零开始可能比复制我显示的配置更有意义。然后你就会明白事情是如何运作的。