5.6. GCC-12.2.0 中的 Libstdc++

Libstdc++ 是 C++ 标准库。我们需要它才能编译 C++ 代码 (GCC 的一部分用 C++ 编写)。但在构建第一遍的 GCC时我们不得不暂缓安装它,因为 Libstdc++ 依赖于当时还没有安装到目标目录的 Glibc。

估计构建时间: 0.2 SBU
需要硬盘空间: 1.1 GB

5.6.1. 安装目标系统的 Libstdc++

[注意]

注意

Libstdc++ 是 GCC 源代码的一部分。您应该先解压 GCC 源码包并切换到解压出来的 gcc-12.2.0 目录。

为 Libstdc++ 创建一个单独的构建目录,并进入它:

mkdir -v build
cd       build

准备编译 Libstdc++:

../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --build=$(../config.guess)      \
    --prefix=/usr                   \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0

配置选项的含义:

--host=...

指定使用我们刚刚构建的交叉编译器,而不是 /usr/bin 中编译器。

--disable-libstdcxx-pch

这个开关防止安装预编译头文件,在这个阶段不需要它们。

--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/12.2.0

该选项指定包含文件的安装路径。因为 Libstdc++ 是 LFS 的 C++ 标准库,这个安装路径应该与 C++ 编译器 ($LFS_TGT-g++) 搜索 C++ 标准头的位置一致。在正常的构建过程中,这项信息被构建系统由顶层目录自动传递给 Libstdc++ configure 脚本。但我们没有使用顶层目录构建系统,因此需要明确指定该选项。C++ 编译器会将 sysroot 路径 $LFS (我们在构建第一遍的 GCC 时指定了它) 附加到包含文件搜索目录之前,因此它实际上会搜索 $LFS/tools/$LFS_TGT/include/c++/12.2.0。该选项和后续使用的 DESTDIR 变量 (在 make install 命令中) 一起,确保将头文件安装到这一路径。

运行以下命令编译 Libstdc++:

make

安装这个库:

make DESTDIR=$LFS install

移除对交叉编译有害的 libtool 档案文件:

rm -v $LFS/usr/lib/lib{stdc++,stdc++fs,supc++}.la

该软件包的详细信息在第 8.26.2 节 “GCC 的内容”可以找到。