构建 GCC 9 时出错:找不到版本“GLIBCXX_3.4.30”

构建 GCC 9 时出错:找不到版本“GLIBCXX_3.4.30”

我一直在尝试使用 Debian 存储库中提供的 gcc-12 在 Debian Bookworm (12) 上安装 GCC 9.5。构建失败,因为make找不到GLIBCXX_3.4.30.日志的相关部分make如下:

Making all in po
make[5]: Entering directory '/home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3/po'                                    
msgfmt -o de.mo ../../../../gcc-releases-gcc-9.5.0/libstdc++-v3/po/de.po                                                               
msgfmt -o fr.mo ../../../../gcc-releases-gcc-9.5.0/libstdc++-v3/po/fr.po
msgfmt: /home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6: version `GLIBCXX_3.4.30' not found
 (required by /lib/x86_64-linux-gnu/libicuuc.so.72)                
make[5]: *** [Makefile:550: de.mo] Error 1                         
make[5]: *** Waiting for unfinished jobs....                       
msgfmt: /home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6: version `GLIBCXX_3.4.30' not found
 (required by /lib/x86_64-linux-gnu/libicuuc.so.72)                
make[5]: *** [Makefile:550: fr.mo] Error 1
make[5]: Leaving directory '/home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3/po'
make[4]: *** [Makefile:562: all-recursive] Error 1
make[4]: Leaving directory '/home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3'
make[3]: *** [Makefile:487: all] Error 2
make[3]: Leaving directory '/home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3'
make[2]: *** [Makefile:19557: all-stage1-target-libstdc++-v3] Error 2
make[2]: Leaving directory '/home/apps/builds/gcc/gcc-9/build'
make[1]: *** [Makefile:27270: stage1-bubble] Error 2
make[1]: Leaving directory '/home/apps/builds/gcc/gcc-9/build'
make: *** [Makefile:1002: all] Error 2

我使用了以下配置选项:

configure --prefix=path-to-install-dir --disable-multilib --enable-languages=c,c++,fortran --enable-checking --program-suffix=9.5

我真的不明白我遇到的错误。有趣的是,我可以在同一台机器上成功地从源代码编译 GCC 12。/home/apps/builds/gcc/gcc-9/gcc-releases-gcc-9.5当我在 .gcc 中构建它时,GCC 源代码就在其中/home/apps/builds/gcc/gcc-9/buildGLIBCXXin的最新版本/home/apps/builds/gcc/gcc-9/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6GLIBCXX_3.4.28

答案1

这里的问题是,您的构建最终依赖于系统库,这些库依赖于最新版本的libstdc++.so.6,但构建了自身的旧版本libstdc++.so.6。后者优先于前者使用,即使在运行第三方工具(例如msgfmt(这就是您的示例中失败的))时也是如此。

因此,严格来说,问题不是用于构建的编译器,而是构建新编译器的依赖项时使用的库......您可以通过跳过构建来解决此问题libstdc++:添加--disable-libstdcxxconfigure选项。据此configure产生了一个工作配置,但我还没有运行构建来检查;特别是,我不知道“缺失”是否libstdc++会导致问题,或者是否libstdc++会使用该系统来代替。

您可能会发现它使用起来更简单软件包gcc-9不稳定— 它提供了所有正确构建的库。您可以使用容器映像或 chroot 来访问它(请参阅 参考资料mmdebstrap)。

答案2

为了构建有自己版本的 GCC libstdc++.so.6,您首先需要构建一个版本GNU 获取文本这是用纯C编写的,例如0.17

配置时,提供不同的前缀,例如/opt/gettext

./configure --prefix=/opt/gettext

并在构建GCC时暂时添加${prefix}/bin到其中。PATH

相关内容