在编译时是否有标识SunOS/Solaris版本的头文件?
Is there a header identifying SunOS/Solaris version at compile time?
我试图在编译时检测Solaris/SunOS版本,以便我可以启用/禁用port_create()
和其他api的使用。
在编译时是否有标识SunOS/Solaris版本的头文件?
如果没有头文件给你这个信息,你当然可以解析uname
的输出,并从你的构建脚本/makefile/生成-D
预处理器选项…
根据@ means -matters的建议,可以使用uname -r
的输出创建编译时定义,例如SUN_VERSION
。这实际上给出了一个浮点数,例如5.10
,您可以使用一个简单的sed命令将其转换为与预处理器相当的形式,例如,这个编译器选项:
-DSUN_VERSION=`uname -r | sed -e 's/.([0-9]{1,1})$/01/' -e 's/.//'`
为5.10
生成510
,为5.9
生成509
,等等。
在源程序中,可以这样使用
#if SUN_VERSION >= 510
识别操作系统版本以断言API
是否可用是有风险的,如果不是注定要失败的话。你不能假设API
会保留在未来的版本中,也不能假设它在并行分支中可用。Illumos和Solaris 11都报告SunOS 5.11
作为他们的版本)。
克服这个问题的通常方法是简单地检查API
是否可用,通过编译一个小的测试源代码来找出它。这通常是在一个传统上名为configure
的脚本中完成的,该脚本构建一个Makefile
和一个针对您的系统量身定制的包含文件。
要展开@ means -matters的答案,使用GNU make,并设置一个变量为操作系统版本。使用-D
命令行选项将该变量传递给编译器。
Makefile:
OS_VERSION := $(shell uname -r)
version:
$(CC) -DOS_VERSION=$(OS_VERSION) version.c -o version
test:
echo $(OS_VERSION)
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 );
}
输出:bash 4.1$ gmake test
echo 5.11
5.11
bash 4.1$ gmake version
cc -DOS_VERSION=5.11 version.c -o version
bash 4.1$ ./version
OS Version: 5.11
bash 4.1$
使用:=
(如果没有设置则分配)只运行一次uname
命令。
在Solaris 10中将显示"5.10",在Solaris 11中将显示"5.11"。
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- ld.so.1:protoc:fatal:libstdc++.so.6:在 Solaris 11 中找不到版本"GLIBCXX_3.4.20"
- Solaris 上的 GNU gcc/g++ 编译器版本,支持 C++11/14
- DBX:Solaris版本的AIX等效版本
- 在编译时是否有标识SunOS/Solaris版本的头文件?