如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

时间:2022-11-02 22:28:56

作者: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”。

如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,$(PlatformToolset)为“v120_xp”,$(PlatformToolsetVersion)为“120”,而“继承的值”中多了一项“_USING_V110_SDK71_”。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

  再看“VC++目录”与SDK目录相关的环境变量宏:

当平台工具集设为“Visual Stdio 2013 (v120)”时,“VC++目录”是指向默认Windows SDK路径(Windows SDK 8.1)。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

当平台工具集设为“Visual Stdio 2013 - Windows XP (v120_xp)”时,“VC++目录”是指向Windows SDK 7.1路径。
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))

  然后可以再试试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)”
如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(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://*.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))的更多相关文章

  1. error MSB8008: 指定的平台工具集(v110)未安装或无效

    转自VC错误:http://www.vcerror.com/?p=318 问题描述: 平台工具集(v110)是vs2012下用的,你是用vs2010打开工程,它默认是用v100, 所以这个工程可能用v ...

  2. VS平台工具集版本

    参考:http://blog.csdn.net/hillseas/article/details/47373313 VS从2010之后开始支持使用之前的版本进行编译,可以在工程属性->常规中进行 ...

  3. vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

    vs2012上的项目导入到vs2010中,编译出现 >------ 已启动生成: 项目: HelloGame.win32, 配置: Debug Win32 ------ >生成启动时间为 ...

  4. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值

    如果你的电脑上有两个不同版本的VS,或者你的程序拷贝到别人的电脑上去运行,或者你是从别人那里拷贝来的项目,而你们俩用的VS版本不一样,就会在运行的时候出现这个问题,这个错误中的v110是VS2012使 ...

  5. 解决 vs2010问题 error MSB8008: 指定的平台工具集(v110)未安装或无效

    一次编译程序时.出现故障 >------ 已启动生成: 项目: PhotoStore, 配置: Debug Win32 ------ 1>生成启动时间为 2013-01-15 18:10: ...

  6. .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 ...

  7. VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法

    转自:http://blog.csdn.net/chaijunkun/article/details/6658923 这是VS2010的改变,不能够在“工具-选项”中看到“VC++目录”了. 但是呢, ...

  8. error MSB8008: 指定的平台工具集(V120)未安装或无效。

    打开项目属性->配置属性->右面,平台工作集,选为v10 如下图

  9. v140平台工具集与v110工具集选择

    今天在编译用vs2012编译C++动态库提示:error MSB8020: The builds tools for v140_xp (Platform Toolset = 'v140_xp') ca ...

随机推荐

  1. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  2. windows环境下配置php和redis

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 一.Window 下安装 下载地址:https://github.com/dmajkic/redis/downl ...

  3. word-wrap 和 word-break

    一.word-wrap 1.浏览器支持 所有主流浏览器都支持 word-wrap属性 2.定义和用法 word-wrap 属性允许长单词或 URL 地址换行到下一行. 语法 word-wrap: no ...

  4. codeforces 983B XOR-pyramid

    题意: 定义一个函数f(a): 给出一个数组a,有q个询问,每次询问回答在l到r的区间内,连续子串的f函数的最大值. 思路: 画图,来自codeforces SheepRanger 由此图可知,f(l ...

  5. SpringBoot使用注解实现事务管理

    conttoller controller和普通的controller类一样, 不用改变 @RequestMapping(value = "/path/{id}", method ...

  6. 网站申请HTTPS 访问

    #生成证书和key openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /opt/nginx/pdk.key -out /opt ...

  7. [20170825]不启动监听远程能连接数据库吗2.txt

    [20170825]不启动监听远程能连接数据库吗2.txt --//曾经写过一篇不启动监听连接数据库的帖子:http://blog.itpub.net/267265/viewspace-1816211 ...

  8. MT【38】与砝码有关的两个题

    此题只适合1%的优秀学生阅读: 北京大学2017中学生数学奖个人能力挑战赛第四题(最后一题) 解析:第一问: 第二问,略,答案也是147. 类似的: 评:1.北大的题用了2进制,后面的这题用了三进制, ...

  9. 通过putty进行端口映射并且启动jupyter notebook

    通过内网穿透之后,一般而言,我们访问内网中的机器在ubuntu下一句命令: ssh name@阿里云 -p 6000即可进行访问,其中-p是表示端口号:同样的通过windows下的putty也可修改对 ...

  10. spring-整合Struts2

    1. Spring 如何在 WEB 应用中使用 ? 1). 需要额外加入的 jar 包: spring-web-4.0.0.RELEASE.jarspring-webmvc-4.0.0.RELEASE ...