在 GCC 4.5.2 配置脚本(我有,但不是 4.3.4)中,大约在第 4500 行(15.5K 行),有节:
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if test "${ac_cv_objext+set}" = set; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
main ()
{
;
return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
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_compile") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
*.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
*) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
break;;
esac
done
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot compute suffix of object files: cannot compile
See \`config.log' for more details." "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
基本上,该脚本正在尝试编译“conftest.c”并试图找到创建的目标文件的扩展名 - 并且由于某种原因,您的编译器没有创建 conftest.o。
这不是它在编译器上进行的第一次测试,因此您的环境中似乎发生了一些相当奇怪的事情。
多年来,我在 Solaris 和 MacOS X 上多次构建 GCC,而且我一直使用 --prefix 选项。那不是问题。 GMP、MPFR、MPC 目录是必要的;您使用的唯一我不熟悉的选项是--with-local-prefix。
您是否以某种方式指定引导编译器?考虑添加CC=/usr/bin/gcc 或类似的东西来尝试您当前的配置行,在您的机器上确定一个完全工作的编译器。我不相信这会解决问题,但是编译器的行为方式或它产生的目标文件扩展名有些有趣。我假设您在磁盘系统上有几 GB 的空闲空间?你会需要那个。
浏览“Installing GCC: Configuration”页面,我发现:
--with-local-prefix=dirname
指定本地包含文件的安装目录。默认值为/usr/local。如果您希望编译器在目录 dirname/include 中搜索本地安装的头文件而不是 /usr/local/include,请指定此选项。
只有当您的网站有不同的约定(不是/usr/local)来放置特定于网站的文件时,您才应该指定--with-local-prefix。
--with-local-prefix 的默认值是 /usr/local,与 --prefix 的值无关。指定--prefix 对GCC 搜索本地头文件的目录没有影响。这似乎违反直觉,但实际上是合乎逻辑的。
--prefix 的目的是指定安装 GCC 的位置。 /usr/local/include 中的本地头文件(如果您在该目录中放置了任何头文件)不是 GCC 的一部分。它们是其他程序的一部分——也许还有许多其他程序。 (GCC 根据--prefix 值将自己的头文件安装在另一个目录中。)
本地前缀包含目录和 GCC 前缀包含目录都是 GCC 的“系统包含”目录的一部分。虽然这两个目录不是固定的,但是为了正确处理 include_next 指令,需要按正确的顺序搜索它们。在 GCC 前缀包含目录之前搜索本地前缀包含目录。系统包含目录的另一个特点是这些目录中的标题关闭了迂腐警告。
一些 autoconf 宏将 -I 目录选项添加到编译器命令行,以确保搜索包含已安装包头文件的目录。当 directory 是 GCC 的系统包含目录之一时,GCC 将忽略该选项,以便继续以正确的顺序处理系统目录。这可能会导致搜索顺序与指定的不同,但仍会搜索目录。
GCC 使用 GCC_EXEC_PREFIX 自动搜索普通库。因此,当 GCC 和包使用相同的安装前缀时,GCC 将自动搜索头文件和库。这提供了易于使用的配置。 GCC 的行为方式类似于将其作为系统编译器安装在 /usr 中时的行为。
需要安装多个版本 GCC 的站点可能不想使用上面的简单配置。可以使用 --program-prefix、--program-suffix 和 --program-transform-name 选项将多个版本安装到一个目录中,但使用不同的前缀和 --with- 可能更简单local-prefix 选项指定每个版本的站点特定文件的位置。然后,用户需要明确指定本地站点库的位置(例如,使用 LIBRARY_PATH)。
--with-local-prefix 和--prefix 可以使用相同的值,前提是它不是/usr。这可以用来避免/usr/local/include的默认搜索。
不要将/usr 指定为--with-local-prefix!您用于--with-local-prefix 的目录不得包含任何系统的标准头文件。如果它确实包含它们,某些程序将被错误编译(包括某些目标上的 GNU Emacs),因为这将覆盖并取消由 fixincludes 脚本所做的头文件更正。
迹象表明,使用此选项的人是基于对其用途的错误想法而使用它的。人们使用它就好像它指定了安装 GCC 的一部分的位置。也许他们做出这个假设是因为安装 GCC 会创建目录。
您确定您使用正确吗?您可能是因为您必须搜索才能找到该选项——../gcc-4.x.y/configure --help 没有提及该选项。