【问题标题】:Trouble building gcc-4.3.4 in a non-standard location在非标准位置构建 gcc-4.3.4 时遇到问题
【发布时间】:2011-01-14 05:05:53
【问题描述】:

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

../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'

【问题讨论】:

  • 感谢您的回复。我终于把它建好了。 PATH 中的汇编程序与较新的 gcc 之间的兼容性存在一些问题。故事的精神:在安装新的 gcc 时不要相信你早期的 binutils。

标签: c linux gcc compiler-construction build


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您或许应该尝试使用--with-sysroot 而不是--prefix

    【讨论】:

    • 我总是使用 --prefix 和非标准位置构建 GCC;这样可行。我不使用 --with-local-prefix 选项,但我不相信这是问题的一部分。
    【解决方案3】:

    在 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 没有提及该选项。

    【讨论】:

    • 我之前实际上是在尝试不使用 --with-local-prefix 。由于我事先在同一位置安装了 mpfr、gmp 和 mpc,而 /usr/local 实际上在机器上没有任何内容,因此我将位置指定为 local-prefix。
    • 在这个阶段,我最好的建议是:(1) 复制配置脚本,(2) 在错误消息后将其删除,(3) 在 'sh -x',和 (4) 查看从节开始到结尾的输出(最后 100 行左右的输出)。也许这会告诉你出了什么问题。
    • 哦,还有一个技巧:我发现在构建 GCC 时最好确保 --prefix 目录不存在;如果是这样,系统会计算真实路径(通过符号链接读取)并将真实路径嵌入到可执行文件中(即使您希望它使用您指定的名称)。然而,这是处理过程中的后期阶段。
    • 哦,还有另一个技巧:如果你的 shell 不够像 POSIX,你可能需要在环境中设置 CONFIG_SHELL。我需要在 /bin/sh 是一个相当普通的 Bourne shell 并且不够用的 Solaris 上执行此操作。然而,这也给我在编译后期造成了问题——在配置 Java、IIRC 时。但是,如果您使用不寻常的 shell(可能是zsh?),您可能需要将 CONFIG_SHELL 设置为 bash 或 ksh。
    猜你喜欢
    • 2010-12-14
    • 2012-11-19
    • 2018-04-16
    • 1970-01-01
    • 2015-08-15
    • 2021-08-02
    • 2018-07-03
    • 2011-05-14
    • 2021-04-14
    相关资源
    最近更新 更多