代码中某些(例如
backtrace
)函数有不同的实现。此实现因 libc 版本而异。就我而言,它可能是 glibc (Debian) 或 musl libc (openwrt)。如何检测 Linux 发行版中安装了哪些 libc?
对具有特定于平台的源代码的项目使用 Autotools 仅检测 CPU 平台而不是 libc 版本
如何检测Linux发行版中安装了哪些libc?
Autotools 没有用于识别 C 库实现的内置机制,而且我不知道有什么好的、可移植的方法来以编程方式做出这样的一般决定。
但似乎您真正想知道的是某些函数是否存在并且具有满足特定标准的行为。最好也是最惯用的方法是直接测试这些东西,而不是依赖 CPU 架构和标准库系列等代理。在这种情况下,它可能也更容易。好处包括
您不需要编译或维护有关哪些代理指标预测您期望的行为的数据,特别是,您不会冒此类数据错误或过时的风险;和
更清楚您想要满足的真正构建要求是什么。
您举了
backtrace()
作为例子。在这种情况下,您可以“生成一个简单的测试程序”来调用该函数,检查其输出,并通过其退出状态指示它是否满足您的要求。您可以首先使用 AC_CHECK_FUNC
检查它是否存在,但这可能是不必要的,因为该宏将执行的操作是您想要跟进的操作的严格子集。具体来说,您可能正在寻找
AC_RUN_IFELSE
。例如,
AC_MSG_CHECKING([whether backtrace@{:@@:}@ exists and works])
AC_RUN_IFELSE ([
AC_LANG_PROGRAM([
#include <execinfo.h>
], [
void *buffer[2];
exit(!(1 == backtrace(buffer, 2)));
])
], [
AC_MSG_RESULT([yes])
# shell code to execute in this case (possibly including other Autoconf macros), maybe:
backtrace_works=1
], [
AC_MSG_RESULT([no])
# shell code to execute in this case (possibly including other Autoconf macros), maybe:
backtrace_works=0
])
您可以将此类代码直接放入您的
configure.ac
中,或者将其包装在
外部宏定义中,然后仅在
configure.ac
中放置对该宏的调用。