C++ 是否有在编译时标识SunOS/Solaris版本的头文件?
我试图在编译时检测Solaris/SunOS版本,以便启用/禁用和其他API的使用C++ 是否有在编译时标识SunOS/Solaris版本的头文件?,c++,c,solaris,C++,C,Solaris,我试图在编译时检测Solaris/SunOS版本,以便启用/禁用和其他API的使用 编译时是否有标识SunOS/Solaris版本的头?如果没有头提供此信息,您当然可以解析uname的输出,并从构建脚本/makefile/…生成-D预处理器选项来扩展@meansion matters answer,使用GNU make,和操作系统版本。使用-D命令行选项将该变量传递给编译器 生成文件: OS_VERSION := $(shell uname -r) version: $(CC) -DOS
编译时是否有标识SunOS/Solaris版本的头?如果没有头提供此信息,您当然可以解析
uname
的输出,并从构建脚本/makefile/…生成-D
预处理器选项来扩展@meansion matters answer,使用GNU make,和操作系统版本。使用-D
命令行选项将该变量传递给编译器
生成文件:
OS_VERSION := $(shell uname -r)
version:
$(CC) -DOS_VERSION=$(OS_VERSION) version.c -o version
test:
echo $(OS_VERSION)
c版:
#include <stdio.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
int main()
{
printf( "OS Version: " TOSTRING(OS_VERSION) "\n" );
return( 0 );
}
使用:=
(如果尚未设置,则分配)仅运行uname
命令一次
这将显示Solaris 10的“5.10”,Solaris 11的“5.11”。详细说明@的建议,可以使用
uname-r
的输出创建编译时定义,例如SUN\u VERSION
。这实际上给出了一个浮点数,例如,5.10
,您可以使用一个简单的sed命令将其转换为预处理器的类似形式,例如,此编译器选项:
-DSUN_VERSION=`uname -r | sed -e 's/\.\([0-9]\{1,1\}\)$/0\1/' -e 's/\.//'`
为5.10
生成510
,为5.9
生成509
,等等
在源程序中,您可以这样使用它
#if SUN_VERSION >= 510
(或任何有意义的东西)。识别操作系统版本以断言
API是否可用,如果不是注定要失败的话,这是有风险的。您不能假设API
将保留在将来的版本中,也不能假设它在并行分支中可用(例如,Illumos与Solaris 11,两者都将SunOS 5.11
作为其版本报告)
克服这个问题的通常方法是通过编译一个小的测试源代码来检查API
是否可用。这通常在传统上命名为configure
的脚本中完成,该脚本构建了一个Makefile
和一个为您的系统定制的include文件 您不需要gnumake来完成这个过程(它可以通过makefile中的普通shell命令来实现)。@ThomasDickey我确信这一点。把你的解决方案也贴出来作为答案。但我已经习惯于使用GNU make——即使在Solaris上也是如此——以至于我现在一直默认使用它。即使在Solaris上,GNU扩展也已变得司空见惯。我非常确定,甚至OpenSolaris的某些部分(在Oracle关闭之前)都必须使用GNU make构建。我希望你没有因此而投我一票……这就是我的意思;非常好
#if SUN_VERSION >= 510