为啥 autoconf 会错误地找到以后不可用的功能?

Posted

技术标签:

【中文标题】为啥 autoconf 会错误地找到以后不可用的功能?【英文标题】:Why does autoconf erroneously find a function which isn't available later?为什么 autoconf 会错误地找到以后不可用的功能? 【发布时间】:2014-04-06 15:56:49 【问题描述】:

在 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】:

根据arc4random(3),要使用此功能,您应该在代码中包含<bsd/stdlib.h>并将其与-lbsd链接。

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

【讨论】:

以上是关于为啥 autoconf 会错误地找到以后不可用的功能?的主要内容,如果未能解决你的问题,请参考以下文章

wordpress更改过页面固定连接以后为啥新建页面会出现404错误?

为啥 autoconf 脚本中的条件在变量前加上“x”?

为啥 ionic run ios 会出现“未找到匹配的配置文件”错误?

kettle 定义错误出处理以后,后面的步骤为啥总是执行?

如何设置 automake 和 autoconf 以有条件地构建程序(测试或其他)

如何在 Autoconf 中确定编译器名称或供应商?