使用 gcc 4.7.2 和 autoconf 2.69 进行编译时,我经常在 configure.log 中得到如下结果。例如:
configure:3091: $? = 0
configure:3080: gcc -V >&5
gcc: error: unrecognized command line option '-V'
gcc: fatal error: no input files compilation terminated.
configure:3091: $? = 1
configure:3080: gcc -qversion >&5
gcc: error: unrecognized command line option '-qversion'
gcc: fatal error: no input files compilation terminated.
configure:3091: $? = 1
configure:3111: checking whether the C compiler works
configure:3133: gcc -march=x86-64 -mtune=generic -Os -pipe -Wl,-O1 conftest.c >&5
configure:3137: $? = 0
configure:3185: result: yes
编译成功进行,但我想知道为什么 autoconf 会测试 gcc 不支持的命令行。这适用于其他编译器吗?
答案1
引用此:
gcc -V 是一种在您拥有多个 gcc 版本时选择特定 gcc 版本的方法,但在这里这是一个诱饵:configure 正在遍历一组选项(--version -v -V 等)以确保它可以记录 C 编译器的版本,无论是 gcc 还是其他什么。
引用此:
gcc 以前有一个 -V 选项用于版本报告。现在它使用 -v,并提供编译器构建时使用的配置选项。
您的包裹有点过时了,没有反映出这个事实。
顺便说一句,-qversion 选项已合并到 -v 中……
引用此:
在某些版本的 gcc 中,-V 选项会指示它使用指定版本的编译器 - 但需要一个参数。它在此处有记录。该选项似乎在 4.5.4 和 4.6.4 之间的某个时间被删除了。
引用这个:
答案2
现代 autoconf 版本 2.69 可与以下扩展编译器信息提取方法一起使用:
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
sed '10a\
... rest of stderr output deleted ...
10q' conftest.err >conftest.er1
cat conftest.er1 >&5
rm -f conftest.er1 conftest.err
fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
if test $ac_status = 0; then break; fi}
done
它已经适应尝试现代和旧版本的提取标志。修复在最后一行,允许在第一次成功后跳过测试。