无法在非标准位置构建gcc-4.3.4

时间:2011-01-14 05:05:53

标签: c linux gcc compiler-construction build

我需要在非标准位置构建gcc-4.3.4(安装NFS)。我配置了:

../gcc-4.3.4/configure --prefix={install dir} --with-gmp={install dir} --with-mpfr={install dir} --with-local-prefix={install dir} --disable-shared

我跑了make -j1。但我一直在说:

checking for suffix of object files... configure: error: cannot compute suffix of object files: cannot compile

x86_64-unknown-linux-gnu/libgcc/config.log中,我可以看到:

/home/panthdev/apps/gcc-4.3.4-compliant/compiler/objdir/./gcc/cc1: error while loading shared libraries: libmpfr.so.1: cannot open shared object file: No such file or directory
libmpfr.so.1中有

{install dir}/lib。此外,如果我将LD_LIBRARY_PATH设置为{install dir}/lib,则会发现libmpfr.so.1config.log开始抱怨:

/tmp/cce9YhFK.s: Assembler messages:
/tmp/cce9YhFK.s:16: Error: bad register name `%rbp'
/tmp/cce9YhFK.s:18: Error: bad register name `%rsp'

3 个答案:

答案 0 :(得分:2)

当我阅读here时,你有32位binutils,而gcc正试图进行64位构建。确保你的binutils& gcc具有相同的配置。

答案 1 :(得分:0)

您应该尝试使用--with-sysroot代替--prefix

答案 2 :(得分:0)

在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,请指定此选项。

     

只有当您的网站对于放置网站特定文件的位置有不同的约定(而非--with-local-prefix)时,才应指定/usr/local

     

--with-local-prefix的默认值为/usr/local,与--prefix的值无关。指定--prefix对GCC搜索本地头文件的目录没有影响。这似乎违反直觉,但实际上它是合乎逻辑的。

     

--prefix的目的是指定GCC的安装位置。 /usr/local/include中的本地头文件 - 如果您将任何内容放在该目录中 - 不属于GCC。他们是其他计划的一部分 - 也许还有很多其他计划(GCC在另一个基于--prefix值的目录中安装自己的头文件。)

     

本地前缀包含目录和GCC前缀包含目录都是GCC“系统包含”目录的一部分。虽然这两个目录不是固定的,但是需要按正确的顺序搜索它们以正确处理include_next指令。在GCC前缀包含目录之前搜索local-prefix包含目录。系统包括目录的另一个特征是关闭这些目录中标题的迂腐警告。

     

某些autoconf宏将-I目录选项添加到编译器命令行,以确保搜索包含已安装包的标头的目录。当目录是GCC的系统包含目录之一时,GCC将忽略该选项,以便继续以正确的顺序处理系统目录。这可能会导致搜索顺序与指定的不同,但仍会搜索目录。

     

GCC使用GCC_EXEC_PREFIX自动搜索普通库。因此,当GCC和包使用相同的安装前缀时,GCC将自动搜索标头和库。这提供了易于使用的配置。 GCC的行为方式类似于在/ usr中作为系统编译器安装时的行为。

     

需要安装多个GCC版本的网站可能不希望使用上述简单配置。可以使用--program-prefix, - program-suffix和--program-transform-name选项将多个版本安装到一个目录中,但使用不同的前缀可能更简单。 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未提及该选项。