如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))
作者:zyl910
从VS2010开始,提供了一个平台工作集(Platform ToolSet)选项用于配制vc编译版本。到了VS2012,更是因为默认平台工具集不支持WindowsXP,导致经常需要切换到xp版平台工具集,VS2013也是如此。在某些时候,我们需要使用条件编译判断平台工具集的版本去做不同的操作,而VS中没有提供一个标准的检测办法。本文就是我的一些心得。
在设置了平台工作集后,环境变量宏会发生变换,而且“VC++目录”、“预处理器定义”等地方也会发生一些变化。
以VS2013为例,注意观察“Visual Stdio 2013 (v120)”、“Visual Stdio 2013 - Windows XP (v120_xp)”的区别。
先看“C/C++” ->“预处理器” ->“预处理器定义”与平台相关的环境变量宏:
当平台工具集设为“Visual Stdio 2013 (v120)”时,$(PlatformToolset)为“v120”,$(PlatformToolsetVersion)为“120”。

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,$(PlatformToolset)为“v120_xp”,$(PlatformToolsetVersion)为“120”,而“继承的值”中多了一项“_USING_V110_SDK71_”。
再看“VC++目录”与SDK目录相关的环境变量宏:
当平台工具集设为“Visual Stdio 2013 (v120)”时,“VC++目录”是指向默认Windows SDK路径(Windows SDK 8.1)。
当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,“VC++目录”是指向Windows SDK 7.1路径。
然后可以再试试v110、v110_xp等平台工作集,从中可以找到规律——
$(PlatformToolset):平台工作集名称。如 v110、v110_xp、v120、v120_xp
$(PlatformToolsetVersion):平台工作集版本号。如 110、120。注意xp版平台工具集(v110_xp、v120_xp)使用相同的版本号(110、120)
VC++目录:自动绑定相关的Windows SDK。v120是Windows SDK 8.1,v110是Windows SDK 8.0,而v110_xp、v120_xp是Windows SDK 7.1。
环境变量宏:对于xp版平台工具集,“继承的值”中会多一项“_USING_V110_SDK71_”。
根据上面的规律,很容易区分是不是兼容WindowsXP的平台工具集。判断是否存在“_USING_V110_SDK71_”宏就行。
如果你像我一样担心“_USING_V110_SDK71_”这个宏名称可能会增加依赖性的话,还可以使用另一种办法——根据Windows SDK的版本来判断是不是兼容WindowsXP的平台工具集。具体办法是使用_WIN32_WINNT宏,若其值小于等于0x0601(Windows7)表示兼容WindowsXP,而大于等于0x602(Windows8)时表示不兼容WindowsXP。例如——
#if (_WIN32_WINNT >= 0x602)
// 不兼容WindowsXP的平台工具集
#else
// 兼容WindowsXP的平台工具集
#endif
现在唯一的问题就是判断具体的平台工作集版本了。$(PlatformToolsetVersion)这样的环境变量宏似乎不会自动转为C语言宏,该怎么办呢?
解决办法很简单,在“预处理器定义”中定义自己的宏就行了,例如添加一条“_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion)”
然后就能在程序中通过_MSC_PLATFORM_TOOLSET宏来判断平台工具集了,例如——
#if (_MSC_PLATFORM_TOOLSET > 100) // Visual Stdio 2010 (v100)
...
#endif
参考文献
~~~~~~~~
Visual Studio: how to check used C++ platform toolset programmatically. http://stackoverflow.com/questions/13794130/visual-studio-how-to-check-used-c-platform-toolset-programmatically
Using the Windows Headers. http://msdn.microsoft.com/en-us/library/aa383745.aspx
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))的更多相关文章
- error MSB8008: 指定的平台工具集(v110)未安装或无效
转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...
- VS平台工具集版本
参考:http://blog.csdn.net/hillseas/article/details/47373313 VS从2010之后开始支持使用之前的版本进行编译,可以在工程属性->常规中进行 ...
- vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
vs2012上的项目导入到vs2010中,编译出现 >------ 已启动生成: 项目: HelloGame.win32, 配置: Debug Win32 ------ >生成启动时间为 ...
- error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值
如果你的电脑上有两个不同版本的VS,或者你的程序拷贝到别人的电脑上去运行,或者你是从别人那里拷贝来的项目,而你们俩用的VS版本不一样,就会在运行的时候出现这个问题,这个错误中的v110是VS2012使 ...
- 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效
一次编译程序时.出现故障 >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10: ...
- .NET Framework 2.0/3.0/3.5 以 v90 平台工具集为目标。请确保在计算机上安装了 Visual Studio 2008
今天在Visual Studio2010下面开发C++应用的时候发现“.NET Framework 2.0/3.0/3.5 以 v90 平台工具集为目标.请确保在计算机上安装了 Visual Stud ...
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
转自:http://blog.csdn.net/chaijunkun/article/details/6658923 这是VS2010的改变,不能够在“工具-选项”中看到“VC++目录”了. 但是呢, ...
- error MSB8008: 指定的平台工具集(V120)未安装或无效。
打开项目属性->配置属性->右面,平台工作集,选为v10 如下图
- v140平台工具集与v110工具集选择
今天在编译用vs2012编译C++动态库提示:error MSB8020: The builds tools for v140_xp (Platform Toolset = 'v140_xp') ca ...
随机推荐
- 远程桌面Default.rdp 中各个参数的含义(转)
存储在 Default.rdp 文件中的设置 默认情况下,将在“我的文档”文件夹中创建 Default.rdp 文件.以下 RDP 设置存储在 Desktop.rdp 文件中: desktopwidt ...
- mybatis 控制台打印sql
开发时调试使用 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBe ...
- ICE系列之3对象接口定义语言——slice
Slice 定义由编译器编译到特定的实现语言 .编译器把与语言无关的定 义翻译成针对特定语言的类型定义和 API.开发者使用这些类型和 API 来 提供应用功能,并与 Ice 交互.用于各种 ...
- Echarts动态加载后台数据
注意:1.用Ajax请求获取后台数据 2.Echarts只能处理Json数据 后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后 ...
- Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...
- 贪心+构造( Codeforces Round #344 (Div. 2))
题目:Report 题意:有两种操作: 1)t = 1,前r个数字按升序排列: 2)t = 2,前r个数字按降序排列: 求执行m次操作后的排列顺序. #include <iostream&g ...
- lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了
lvs主备可以自由切换,vip落在主上的时候,端口无法telnet,业务连接不了 解决:将主上的keepalived重启,故障解除 原因:不可知 lvs常见故障原因: real server上的脚步没 ...
- wav文件格式分析(三)
(四)附表 1.头格式表: 2.PCM数据的存放方式 3.PCM波形样本的数据格式 WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数. 首先存储低有效字节,表示样 ...
- go protobuf 安装
1.https://github.com/google/protobuf/releases/tag/v3.0.0 下载需要的版本,如果执行autogen.sh的过程中出现autoreconf not ...
- 如何使不同主机上的docker容器互相通信
docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...