为什么autoconf会错误地找到以后无法使用的功能?

时间:2014-03-04 21:27:11

标签: linux autotools autoconf

在Linux系统上,我配置了一个软件包(llvm),autoconf找到了arc4random函数。这里是配置期间输出的提取:

checking for strerror... yes
checking for strerror_r... yes
checking for setenv... yes
checking for arc4random... yes
checking for strtoll... yes
checking for strtoq... yes
checking for sysconf... yes

配置正常。之后,在构建程序包时,我收到有关未声明的说明符arc4random的错误:

[removed]/lib/Support/Unix/Process.inc:368:10: error: use of undeclared identifier
      'arc4random'
  return arc4random();
         ^

这里提到的位置:

367 #if defined(HAVE_ARC4RANDOM)
368   return arc4random();
369 #else
370   static int x = (::srand(GetRandomNumberSeed()), 0);
371   (void)x;
372   return ::rand();
373 #endif

它得到了适当的保护,这里是configure.ac篇:

AC_CHECK_FUNCS([strerror strerror_r setenv arc4random ])

似乎一切都很好。我想知道为什么配置过程检测到该功能可用。

autoconf(GNU Autoconf)2.63

此处摘录自config.log

configure --prefix=[removed] --host=powerpc64-bgq-linux --disable-terminfo --disable-zlib --enable-targets=powerpc CXX=bgclang++ CXXFLAGS=-O3 -fPIC CC=bgclang CFLAGS=-O3 -fPIC LDFLAGS=-shared

1 个答案:

答案 0 :(得分:3)

根据arc4random(3),要使用此功能,您应在代码中加入<bsd/stdlib.h>并将其与-lbsd相关联。

这个AC_CHECK_FUNCS([... arc4random ])做的是确保系统中存在arc4random,然后定义名为HAVE_ARC4RANDOM的宏,但不能保证您的代码正确使用它。