本文主要是介绍在程序中如何判断Linux版本信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在编译和部署Linux Kernel时,会自动生成一个表示kernel版本的文件。
比如我在Yocto中编译一个Linux版本时,在和kernel-source同级的kernel-build-artifacts中,有一个version.h文件:
work-shared/my-machine/kernel-build-artifacts/include/generated/uapi/linux/version.h
#define LINUX_VERSION_CODE 393527
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 6
#define LINUX_VERSION_PATCHLEVEL 1
#define LINUX_VERSION_SUBLEVEL 55
在Kernel编译完成后的,会部署到sysroot中,Linux Kernel的构建目录里有,而且其他package构建目录也有,因为构建时需要引用这个sysroot的头文件。
不过这个文件内容和上面的不一样了:
recipe-sysroot/usr/include/linux/version.h
#define LINUX_VERSION_CODE 393472
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 6
#define LINUX_VERSION_PATCHLEVEL 1
#define LINUX_VERSION_SUBLEVEL 0
包括在编译出的SDK里也有这个版本文件:
$ cat sysroots/cortexa55-poky-linux/usr/include/linux/version.h
#define LINUX_VERSION_CODE 393472
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 6
#define LINUX_VERSION_PATCHLEVEL 1
#define LINUX_VERSION_SUBLEVEL 0
如果代码里要使用,只需包含此头文件,并按需使用。
举例:
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
#include <uapi/linux/sched/types.h> // struct sched_param
#include <linux/sched/types.h> // sched_setscheduler
#endif
不止使用Yocto编译嵌入式Linux,在Ubuntu中尝试也可使用:
$ cat /usr/include/linux/version.h
#define LINUX_VERSION_CODE 331668
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 5
#define LINUX_VERSION_PATCHLEVEL 15
#define LINUX_VERSION_SUBLEVEL 148
参考:
error: variable has incomplete type ‘struct sched_param‘ struct sched_param param = { .sched-CSDN博客
这篇关于在程序中如何判断Linux版本信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!