如何在较新的 Linux 发行版 (Devuan Excalibur/Debian Trixie) 上构建较旧的 GCC 版本 (8.5.0)?

如何在较新的 Linux 发行版 (Devuan Excalibur/Debian Trixie) 上构建较旧的 GCC 版本 (8.5.0)?

如果我下载并尝试在较新的机器上构建 GCC 8.x,例如 Devuan Excalibur GNU/Linux(即没有 systemd 的 Debian Trixie),则会失败,错误如下:

libstdc++.so.6: version `GLIBCXX_3.4.30' not found

如果我手动将系统复制到libstdc++6.so缺少相关 [?] 的文件上 - 并重复该过程几次 - 我会遇到不同的错误:

make[7]: Entering directory '/usr/local/src/gcc-8.5.0/x86_64-pc-linux-gnu/32/libitm'
In file included from /usr/include/linux/fs.h:19,
                 from ../../.././libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:68:
/usr/include/linux/mount.h:96:6: error: multiple definition of ‘enum fsconfig_command’
 enum fsconfig_command {
      ^~~~~~~~~~~~~~~~
In file included from ../../.././libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:55:
/usr/local/src/gcc-8.5.0/host-x86_64-pc-linux-gnu/gcc/include-fixed/sys/mount.h:249:6: note: previous definition here
 enum fsconfig_command
      ^~~~~~~~~~~~~~~~
In file included from /usr/include/linux/fs.h:19,
                 from ../../.././libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:68:
/usr/include/linux/mount.h:130:8: error: redefinition of ‘struct mount_attr’
 struct mount_attr {
        ^~~~~~~~~~
In file included from ../../.././libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc:55:
/usr/local/src/gcc-8.5.0/host-x86_64-pc-linux-gnu/gcc/include-fixed/sys/mount.h:219:8: note: previous definition of ‘struct mount_attr’
 struct mount_attr
        ^~~~~~~~~~

这很奇怪,但也许是我试图强制使用库版本的错。无论如何 - 我怎样才能在我的机器上实际构建 GCC 8.5.0?

笔记:

  • 配置为:./configure --disable-bootstrap --enable-languages=c,c++.
  • 任何附加信息将根据请求提供。

答案1

该解决方案涉及几个步骤:

  • 为 GCC 标准 C++ 库的静态 64 位和 32 位版本安装 apt 软件包:libstdc++-dev以及lib32stdc++-dev
  • 配置 GCC 存储库,以免构建 sanitizer 库:--disable-libsanitizer为命令添加参数configure

这应该够了吧。请注意,随着时间的推移以及使用较新版本的 Debian,可能出现的问题会多于您希望修复或解决的情况。

相关 GCC“bug”页面:

相关内容