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

作者: admin 分类: C++ 发布时间: 2020-11-06 08:57

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

1.png

当平台工具集设为“Visual Stdio 2013 – Windows XP (v120_xp)”时,$(PlatformToolset)为“v120_xp”,$(PlatformToolsetVersion)为“120”,而“继承的值”中多了一项“_USING_V110_SDK71_”。

2.png

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

当平台工具集设为“Visual Stdio 2013 (v120)”时,“VC++目录”是指向默认Windows SDK路径(Windows SDK 8.1)。


3.png

当平台工具集设为“Visual Stdio 2013 – Windows XP (v120_xp)”时,“VC++目录”是指向Windows SDK 7.1路径。

4.png

 然后可以再试试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)”

5.png

然后就能在程序中通过_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

 

VS中一种针对平台工具集版本不同的条件编译(以CreoToolkit为例)

https://support.ptc.com/appserver/auth/it/esd/product.jsp?prodFamily=ENG

PRE_PROCESSOR:

_MSC_PLATFORM_TOOLSET=$(PlatformToolsetVersion)

.hxx

#if _MSC_PLATFORM_TOOLSET == 90
#include <pro_interf.h>
#elif _MSC_PLATFORM_TOOLSET == 110
#include <ProFit.h> 
#endif

.cpp

int CTest::TestInterface()
{
    /*....context...*/
    #if _MSC_PLATFORM_TOOLSET == 90
    //TODO
    pro_display_interf_volume(arg, ...);
    #elif _MSC_PLATFORM_TOOLSET == 110
    //TODO
    ProFitInterferencevolumeDisplay(arg, ...); 
    #endif 
    /*....context...*/
}



如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云