为何在configure.ac中无法直接访问$prefix的默认值/usr/local?
问题分析:Autoconf中$prefix默认值为何显示为NONE
尽管Autoconf文档说明$prefix的默认值是/usr/local,但在未调用特定初始化宏的configure.ac脚本中,直接访问$prefix会得到NONE,而非预期的默认值。
测试代码与现象
用户的configure.ac代码如下:
AC_INIT AC_PREREQ([2.52]) # Check if $prefix is defined if test "$prefix" = "NONE"; then AC_MSG_ERROR([\$prefix expands to NONE]) else AC_MSG_NOTICE([\$prefix expands to $prefix]) fi AC_OUTPUT
- 直接运行
./configure,输出:configure: error: $prefix expands to NONE - 手动指定前缀运行
./configure --prefix=/usr/local,输出:configure: $prefix expands to /usr/local
原因解释
Autoconf中$prefix的默认值并非在初始化阶段就自动设置为/usr/local:
- 刚启动configure时,
$prefix的初始值是NONE,这是Autoconf变量的默认占位符。 - 只有当脚本中调用了负责初始化前缀的宏(比如
AC_PREFIX_DEFAULT([/usr/local]),或者AC_PROG_INSTALL这类与安装相关的标准宏),$prefix才会被设置为文档中说明的默认值/usr/local。 - 手动指定
--prefix参数时,configure会直接覆盖$prefix的初始值,因此能正确获取到指定路径。
解决方法
如果需要在configure.ac中访问默认的/usr/local,只需在检查$prefix之前添加初始化宏即可,比如:
AC_INIT AC_PREREQ([2.52]) # 初始化prefix为默认值/usr/local AC_PREFIX_DEFAULT([/usr/local]) # Check if $prefix is defined if test "$prefix" = "NONE"; then AC_MSG_ERROR([\$prefix expands to NONE]) else AC_MSG_NOTICE([\$prefix expands to $prefix]) fi AC_OUTPUT
或者添加AC_PROG_INSTALL(多数实际项目中都会用到这个宏,因为它会处理安装相关的路径和工具),也能自动设置$prefix的默认值。
内容的提问来源于stack exchange,提问作者nfl
相关产品推荐
相关产品推荐

