如何修复“在 ArchLinux 中出现的 GCC 编译错误(sys/ustat.h: 没有那个文件或目录)?”

4

目前,我的ArchLinux系统需要当前版本的gcc(8.3),以及gcc 7.2和gcc 5.5(在其他路径中)。

我正在尝试编译以下源代码:

$ ./contrib/download-prerequisites

在构建目录中:
$ ../gcc-5.5.0/configure --prefix=/home/mjonyh/bin/gcc/5.5.0 --disable-multilib --enable-languages=c,c++,fortran

找到错误

sys/ustat.h: no such file or directory

已安装的软件包:binutils gcc-libs libmpc gcc-ada libmpc dejagnu inetutils lib32-gcc-libs doxygen gcc-ada lib32-glibc

更新: 我通过在gcc-x.x.x/libsanitizer/sanitizer-common/sanitizer-platform-limits-posix.cc中手动注释掉ustat.h(第157和250行)解决了该问题。因为Arch Linux在glibc中弃用了ustat.h。


我认为你需要展示更多的输出。从显示的几行代码中,我只能看出某些东西失败了,导致make报告了一个错误。应该会有一条错误消息在更早之前直接显示是什么导致了失败。 - Keith Thompson
那是什么东西?我该如何找到它? - Md. Enamul Hoque
看起来你的错误是来自于 make 而不是 configure,而且你没有展示给我们 make 命令。运行 make 会产生很多输出,包括错误信息。将该输出保存到文件中,然后在该文件中查找错误信息。 - Keith Thompson
谢谢大家,我已经找到问题所在了。缺失的是_sys/ustat.h_文件。由于我使用的是gcc 8.3版本,有没有什么方法可以解决呢? - Md. Enamul Hoque
来自glibc的NEWS文件:“已弃用的函数ustat不再对新链接的二进制文件可用;头文件<ustat.h><sys/ustat.h>已被删除。该函数已被fstatfsstatfs所取代。” - Keith Thompson
显示剩余2条评论
3个回答

1
glibc 2.28的发布说明如下:
  • 已经删除了头文件<ustat.h><sys/ustat.h>,并且不再提供废弃函数ustat给新链接的二进制文件使用。建议使用fstatfsstatfs代替此函数。
构建GCC 5.5有几个选项:
  • 在使用glibc 2.27或更早版本的旧发行版上进行构建。
  • Go前端的修复移植到GCC 5中。(ustat只是意外添加到Go中,其废弃比Go开发甚至Google公司的开始还要早。)
  • 使用适当的--enable-languages=参数禁用gccgo前端。

由于我的系统不需要使用Go语言,我猜测我所做的“故障排除”不会造成问题。你认为呢? - Md. Enamul Hoque
你可以通过使用configure --enable-languages=showmeplease命令来查看gcc版本支持的语言。 - debuti

1
除此之外:
更新:我通过手动注释掉gcc-x.x.x/libsanitizer/sanitizer-common/sanitizer-platform-limits-posix.cc中的ustat.h(第157和250行)来解决问题。因为archlinux在glibc中弃用了ustat.h。
gcc-7.4.0已经移除了sanitizer-platform-limits-posix.cc中的ustat.h。如果可能的话,请尝试使用7.4.0版本。

0

有一个补丁提交:https://github.com/gcc-mirror/gcc/commit/71b55d45e4304f5e2e98ac30473c581f58fc486b

libsanitizer:为Linux使用预先计算的struct ustat大小。 挑选编译器-rt修订版333213:

<sys/ustat.h>已被glibc 2.28移除,由以下提交所执行:

commit cf2478d53ad7071e84c724a986b56fe17f4f4ca7 Author: Adhemerval Zanella adhemerval.zanella@linaro.org Date: Sun Mar 18 11:28:59 2018 +0800

Deprecate ustat syscall interface

这个补丁在Linux中使用了预先计算的struct ustat的大小。
PR sanitizer/85835
* sanitizer_common/sanitizer_platform_limits_posix.cc: Don't
include <sys/ustat.h> for Linux.
(SIZEOF_STRUCT_USTAT): New.
(struct_ustat_sz): Use SIZEOF_STRUCT_USTAT for Linux.

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