【发布时间】:2019-06-06 22:27:38
【问题描述】:
考虑我正在使用从导出到用户空间的 Linux 标头中的某些功能的情况,例如来自 <linux/perf_event.h> 的 perf_event_open。
此 API 提供的功能随着时间的推移而发生变化,因为成员已添加到 perf_event_attr,例如 perf_event_attr.cap_user_time。
如果这些新功能在本地可用,我如何编写源代码来编译和使用它们,但如果它们不可用并且不使用它们,我该如何优雅地回退?
特别是,我如何在预处理器中检测这些东西是否可用?
我以perf_event_attr 为例,但我的问题是一般性的,因为结构成员、新结构、定义和函数一直在添加。
请注意,这里我只考虑进程在将要运行的同一系统上编译的情况:如果您想在一台主机上编译并在另一台主机上运行,则需要一组不同的技巧。
【问题讨论】:
-
在最坏的情况下:autoconf
-
@AnttiHaapala - 是的,没错。这个项目中还没有引入autoconf,希望能避免。
-
你没看到
version这个字段吗?以下所有答案都不准确。 -
@0andriy - 我见过。我怎么能用它来解决这个问题?
-
@0andriy 你在
perf_event_mmap_page.version领域走来走去吗?在我看来,version字段不能可靠地确定结构的变化。例如,thiscommit 添加了新字段,但似乎没有更改版本。另请注意,该问题并非特定于任何 Linux 内核类型,因此最终必须使用 Linux 内核版本,如下面的答案中所述。
标签: c linux linux-kernel backwards-compatibility perf