我的老师很想学校使用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 ==========
答案 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中转到Debug
或Release
设置并选择{{1}时你将默认获得2015版本,而不是2010年。
Visual Studio 2010,Visual Studio 2015,Visual Studio 2017和Visual Studio 2019同步在C ++的同一项目文件中的步骤:
<强> 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进行编译,依此类推......) - 可能从零而不是复制我显示的配置。然后你就会明白事情是如何运作的。