繁体   English   中英

使用autoconf检查C #define的值

[英]Check value of C #define with autoconf

我知道我可以使用AC_CHECK_DECL / AC_CHECK_DECLS来检查一组标头是否为指定的标识符提供了声明,但是如何不仅检查是否声明了宏,还检查其扩展是否符合我的条件? 具体来说,我想检查numa.h是否包含与此等效的宏定义...

#define LIBNUMA_API_VERSION 2

...包括特定值“ 2”。

UPDATE<numa.h>标头包含一个定义,例如#define LIBNUMA_API_VERSION 2以声明其版本。 使用此标头的C代码通常按如下方式使用它:

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif

我想使用autoconf确定NUMA标头版本,并定义一个宏来简要传达是否提供了NUMA版本2。 即:

if test "$have_numa_v2" = "yes" ; then
    AC_DEFINE(NUMA_VERSION_2, 1, [Determine whether NUMA v2 available)
fi

可以这样使用:

#ifdef NUMA_VERSION_2
....
#endif

可能吗? 我在确定如何在Autoconf文件中设置变量have_numa_v2变量的值时遇到了麻烦。

您可以将AC_COMPILE_IFELSEAC_RUN_IFELSE与结构适当的测试程序一起使用,以确定是否将宏定义为您指定的特定值。 例如,假设当前语言是C:

have_numa_v2=no
AC_RUN_IFELSE([AC_LANG_PROGRAM([
#include <numa.h>
],[
#if LIBNUMA_API_VERSION != 2
exit(1);
#endif
])], [have_numa_v2=yes])

这将构造一个程序,其返回值取决于是否将LIBNUMA_API_VERSION定义为宏,如果这样,则将其扩展为2 如果Autoconf无法编译它(例如,找不到numa.h),或者以0以外的状态退出,则其他任何事情都不会发生( $have_numa_v2保留其分配的值"no" )。 否则,执行第二个参数中的赋值,并且$have_numa_v2最终以值"yes"

就其价值而言,该宏生成和使用的特定测试程序的源包含一些Autoconf标准的宏定义,以及以下内容:

#include <numa.h>

int
main ()
{

#if LIBNUMA_API_VERSION != 2
exit(1);
#endif

  ;
  return 0;
}

使用AC_COMPILE_IFELSE的版本将是类似的,但如果未将宏定义为指定的值,则使用#error预处理程序指令进行编译,以使编译失败。 如果您预料到程序可能会针对外国体系结构交叉编译,那么这种变化可能是更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM