28

我实际上正在阅读 LFS 书(7.1 版),在第 53 页被阻止。尝试编译 gcc,我尝试了以下命令:

./configure --target=$LFS_TGT --prefix=$LFS/build/gcc-build --disable-nls\
--disable-shared --disable-multilib --disable-decimal-float --disable-threads\
--disable-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath\
--disable-target-libiberty --disable-target-zlib\
--enable-languages=c\
--without-ppl --without-cloog\
--with-mpfr-include=$LFS/source/mpfr/src
--with-mpfr-lib=$LFS/source/mpfr/src/.libs\
--with-gmp-include=/mnt/LFS/source/gmp\
--with-gmp-lib=/mnt/LFS/source/gmp/.libs\
--with-mpc-include=/mnt/LFS/source/mpc/src\
--with-mpc-lib=/mnt/LFS/source/mpc/src/.libs

运行 gcc 的配置脚本(当然我已经编译了 mpfr、mpc 和 gmp)。但是一旦我启动:

make -j4

我收到以下错误:

checking for suffix of object files... configure: error: in `/mnt/LFS/source/gcc-4.6.2/x86_64-lfs-linux-gnu/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details.
make[1]: *** [configure-target-libgcc] Error 1

我试图用谷歌搜索它并尝试了我找到的解决方案,但没有任何效果。有谁知道我为什么会收到这个错误?

4

4 回答 4

20

当测试程序尝试链接 libmpc/libmpfr/libgmp 时,此问题是由动态链接库路径问题引起的。

附加下面的环境变量以允许ld链接到正确的so文件:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/mpc/lib/

然后再次尝试构建 gcc。

于 2012-10-23T07:52:33.607 回答
15

“构建 GCC 并非易事,但如果您仔细按照说明进行操作,也不难。许多人在没有正确阅读安装文档的情况下急于尝试构建它,并犯了以下一个或多个常见错误:

  1. 不要从 gcc src 目录运行 ./configure(不支持)=> 您需要从 gcc 源目录之外运行 configure

  2. 注意:如果 GCC 动态链接到必备库 (GMP/MPFR/MPC),那么在构建 gcc 和使用已安装的编译器时,共享库必须位于动态链接器的路径 (LD_LIBRARY_PATH) 中。”

简单示例(没有到 GMP/MPFR/MPC 的动态链接):

tar xzf gcc-4.8.0.tar.gz
cd gcc-4.8.0
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.8.0/configure --prefix=/opt/gcc-4.8.0 
make
make install

资料来源: Advogato Doc - GNU Doc

于 2013-04-25T13:04:58.337 回答
6

此错误消息可能由多种不同原因引起。找出哪一个的最好方法是检查下面示例中的日志文件“/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc/config.log”。或者在原始海报案例中'/mnt/LFS/source/gcc-4.6.2/x86_64-lfs-linux-gnu/libgcc' 并查找最后一个错误行。

引用 GCC 常见问题解答:http: //gcc.gnu.org/wiki/FAQ#configure_suffix

与任何 GNU 项目一样,GCC 使用 GNU 自动工具来为构建系统的细节配置编译。因此,配置脚本使用小型测试程序(通常称为 conftest.c)来测试某些功能和/或特性是否可用。如果此类测试程序的编译失败,您将看到如下错误消息:

 checking for suffix of object files... configure: error: in
 `/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc': configure: error:
 cannot compute suffix of object files: cannot compile See `config.log'
 for more details. make[2]: *** [configure-stage1-target-libgcc] Error
 1 make[2]: Leaving directory `/home/manu/gcc/gcc'

此错误消息非常具有误导性,并且该问题通常与该消息无关。您必须检查发生错误的目录中的文件“config.log”。在上面的示例中,您必须检查目录“/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc”中的“config.log”文件。在配置过程中可能有多个测试程序失败,但其中一些失败并不重要。检查文件中的最后一个错误条目。

此错误消息的常见原因是:

  • 缺少 GCC 构建所需的库,特别是 MPFR、GMP 和 MPC。如果作为共享库安装,它们必须位于运行时链接器的搜索路径中,以便可以找到它们。请按照为什么我的 ./configure 和 make 失败?

  • 编译器崩溃了。例如,如果出现“conftest.c: internal compiler error:”之类的错误,则表明编译器存在错误。如果您使用的是未经修改的 GCC 版本,请按照程序报告错误。

于 2013-05-28T20:08:24.167 回答
2

这发生在创建交叉编译器时。

它不是指顶级config.log,而是$LFS_TGT/libgcc/config.log.

对我来说,在那里,它说:

configure:3566: /foo/gcc/build/./gcc/xgcc -B/foo/gcc/build/./gcc/ -B/opt/gcc-cross-11.1.0/aarch64-none-elf/bin/ -B/opt/gcc-cross-11.1.0/aarch64-none-elf/lib/ -isystem /opt/gcc-cross-11.1.0/aarch64-none-elf/include -isystem /opt/gcc-cross-11.1.0/aarch64-none-elf/sys-include    -o conftest -g -O2   conftest.c  >&5
conftest.c:9:10: fatal error: stdio.h: No such file or directory
    9 | #include <stdio.h>
      |          ^~~~~~~~~
compilation terminated.
configure:3569: $? = 1
configure:3782: checking for suffix of object files
configure:3804: /foo/gcc/build/./gcc/xgcc -B/foo/gcc/build/./gcc/ -B/opt/gcc-cross-11.1.0/aarch64-none-elf/bin/ -B/opt/gcc-cross-11.1.0/aarch64-none-elf/lib/ -isystem /opt/gcc-cross-11.1.0/aarch64-none-elf/include -isystem /opt/gcc-cross-11.1.0/aarch64-none-elf/sys-include    -c -g -O2  conftest.c >&5
/foo/gcc/build/./gcc/as: line 106: exec: -E: invalid option
exec: usage: exec [-cl] [-a name] [command [arguments ...]] [redirection ...]
configure:3808: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "GNU C Runtime Library"
| #define PACKAGE_TARNAME "libgcc"
| #define PACKAGE_VERSION "1.0"
| #define PACKAGE_STRING "GNU C Runtime Library 1.0"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL "http://www.gnu.org/software/libgcc/"
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:3822: error: in `/foo/gcc/build/aarch64-none-elf/libgcc':
configure:3824: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details

你的日志文件相似吗?

我相信 gcc 编译/安装过程将采用各种包含,运行它们fixincludes以解决问题并将它们定制到目标架构。预期的文件不存在。

参考先决条件页面,我相信这部分是相关的(强调我的):

C standard library and headers

In order to build GCC, the C standard library and headers must be present for all
target variants for which target libraries will be built (and not only the variant
of the host C++ compiler).

This affects the popular ‘x86_64-pc-linux-gnu’ platform (among other multilib
targets), for which 64-bit (‘x86_64’) and 32-bit (‘i386’) libc headers are usually
packaged separately. If you do a build of a native compiler on ‘x86_64-pc-linux-gnu’,
make sure you either have the 32-bit libc developer package properly installed (the
exact name of the package depends on your distro) or you must build GCC as a 64-bit
only compiler by configuring with the option --disable-multilib. Otherwise, you may
encounter an error such as ‘fatal error: gnu/stubs-32.h: No such file’

我相信解决方案是获取 TARGET 平台的标头。

于 2021-07-09T00:40:34.730 回答