编译libgcc时出现xgcc错误

12

我正在尝试安装交叉编译器,这份教程中提到,当我想制作libgcc时,我只需在终端中输入make all-target-libgcc。但是执行make时出现了错误。

checking whether ln -s works... yes
checking for i586-elf-gcc...  /usr/src/build-gcc/./gcc/xgcc -B/usr/src/build-gcc/./gcc/         -B/usr/local/cross/i586-elf/bin/ -B/usr/local/cross/i586-elf/lib/ -isystem /usr/local/cross/i586-elf/include -isystem /usr/local/cross/i586-elf/sys-include   
checking for suffix of object files... configure: error: in `/usr/src/build-gcc/i586-elf/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make: *** [configure-target-libgcc] Error 1

在config.log中我找到了

Target: i586-elf
Configured with: ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross --        disable-nls --enable-languages=c,c++ --without-headers : (reconfigured) ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross --disable-nls --enable-languages=c,c++ --without-headers : (reconfigured) ../gcc-4.8.0/configure --target=i586-elf --prefix=/usr/local/cross --disable-nls --enable-languages=c,c++ --without-headers
Thread model: single
gcc version 4.8.0 (GCC) 
configure:3358: $? = 0
configure:3347:  /usr/src/build-gcc/./gcc/xgcc -B/usr/src/build-gcc/./gcc/ -    B/usr/local/cross/i586-elf/bin/ -B/usr/local/cross/i586-elf/lib/ -isystem /usr/local/cross/i586-elf/include -isystem /usr/local/cross/i586-elf/sys-include    -V >&5
xgcc: error: unrecognized command line option '-V'
xgcc: fatal error: no input files
事实上,xgcc没有“-V”选项。我正在寻找编译libgcc的方法。 提前致谢。

通常情况下,libgcc 是 GCC 编译器的一部分,因此应该使用 GCC 进行构建。您不需要特别的操作来进行构建。 - Basile Starynkevitch
2
这里也出现了同样的错误。gcc版本为4.8.1(GCC)。 - e19293001
3个回答

17

问题在于:在按照您描述的方式尝试构建libgcc之前,您构建了一个极简的交叉编译器。现在,配置脚本运行的标准测试之一是测试编译器是否能在正常条件下生成可工作的可执行文件。但是,您的最小化编译器无法做到这一点。幸运的是,对于libgcc,您只需要生成一个静态库libgcc.a,而不是可执行文件。问题在于愚蠢的GNU autoconf生成的脚本没有意识到这一点。

我遇到了同样的问题,并想出了一个非常丑陋的解决方法。您需要注释掉gcc源目录中的libgcc/configure文件的一部分。这是我为我的版本注释掉的部分;您可以类似地处理:

在3484行:

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
# BEGIN PHILLIP EDIT
# if test -z "$ac_file"; then :
  # $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_set_status 77
# as_fn_error "C compiler cannot create executables
# See \`config.log' for more details." "$LINENO" 5; }; }
# fi
ac_file='a.out'
# END PHILLIP EDIT
ac_exeext=$ac_cv_exeext
希望这可以帮到你。

我尝试了几个版本的GCC,但问题始终存在。您的答案似乎是唯一解决我的问题的方法。 - Han Qiu

9

我尝试单独构建libstdc++时遇到了类似的问题。配置选项--enable-offload-target=x86_64-pc-linux-gnu解决了这个问题,而--disable-bootstrap则节省了很多编译时间。添加前面的标志后,make all-target-libstdc++-v3不再抱怨xgcc和编译器无法创建可执行文件。希望这对其他人有所帮助,不需要上述补丁。


0
libgcc/configure文件中注释掉以下部分对我有帮助。请参考https://dev59.com/DGQo5IYBdhLWcg3wZuwc#26245344获取有关configure文件的更多上下文信息。
# 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
#   test $ac_status = 0; }
# done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接