GCC 与 GLIBC 问题

今日,用户提出了要使用 GCC 11.4.0 来编译研发源码的问题。Linux 服务器环境是 CentOS EL7,首先在联网的一台 CentOS EL7 机器上,使用本地 GCC(4.8.0) 构建出 GCC 11.4.0,放在目标 Linux 服务器上后,出现以下问题。

在没有 ./configure --prefix 时,指定 CMAKE_INSTALL_PREFIX

今天(2024-10-12)在为研发安装 nlohmann/json 时,安装规范希望将其安装到 /opt/json-3.11.3 目录,但这个库并未提供 ./configure 脚本,无法像构建其他 C/CXX 程序那要,通过 --prefix 选项指定安装位置。

后发现在 mkdir build && cd build && cmake .. 后,生成的 build/cmake_install.cmake 文件中,顶部就有 CMAKE_INSTALL_PREFIX 环境变量,于是尝试在运行 cmake .. 前,执行 export CMAKE_INSTALL_PREFIX="/json-3.11.3" 设置这个环境变量。达到了预期目的。完整步骤如下。

$ mkdir build && cd build
$ export CMAKE_INSTALL_PREFIX="/json-3.11.3"
$ cmake ..
$ make DESTDIR=/opt -j 32
$ sudo make DESTDIR=/opt -j 32 install

此时检查 build/cmake_install.cmake 中,有关 CMAKE_INSTALL_PREFIX 的行如下。

if(NOT DEFINED CMAKE_INSTALL_PREFIX)
    set(CMAKE_INSTALL_PREFIX "/json-3.11.3")
endif

若执行 unset CMAKE_INSTALL_PREFIX 清空该环境变量再运行,生成的有关行如下。

if(NOT DEFINED CMAKE_INSTALL_PREFIX)
    set(CMAKE_INSTALL_PREFIX "/usr/local")
endif

表明对 CMAKE_INSTALL_PREFIX 环境变量的设置生效。

参考

/lib64/libstdc++.so.6: version 'GLIBCXX 3.4.21' not found

这是因为在使用新的 gcc (/opt/gcc-11.4.0/bin/gcc) 编译代码时,找不到所需的 libstdc++.so.6 所致。解决办法:

export LD_LIBRARY_PATH=/opt/gcc-11.4.0/lib64:$LD_LIBRARY_PATH

/opt/gcc-11.4.0/lib64 添加到 LD_LIBRARY_PATH 这个环境变量中。

/lib64/libm.so.6: version'GLIBC_2.27' not found

此问题正在解决中,预计需要重新构建 GLIBC。

重新构建 GLIBC 2.27 时,需要使用 GCC 7.3.0 和 GNU Make 4.2.1;因此需要首先构建指定版本的这两个工具。

在执行 ../configure ... 后,就要使用 /opt/make-4.2.1/bin/make,在 build 目录下,直接调用 GNU Make 4.2.1 工具,进行 GLIBC 2.27 的构建。

经测试,使用 GCC 7.3.0 和 GNU Make 4.1 构建 GLIBC 2.29 没有问题。

注意:在系统(CentOS EL7)上存在多个 GLIBC 时,不能 export LD_LIBRARY_PATH=/opt/glibc-2.27/lib:$LD_LIBRARY_PATH,这样在执行系统工具(如:lsps)时,会报出 Segmentation fault 错误。而应 export LD_LIBRARY_PATH=/lib64:/opt/glibc-2.27/lib:$LD_LIBRARY_PATH,避免此类错误。

从源码构建 GDB

由于 GDB 依赖 GMP 和 MPFR(MPFR 又依赖 GMP),故要先安装 GMP、MPFR,再安装 GDB。GMP 和 MPFR 的源码,在安装 GCC 时,通过 contrib/download_prerequistes 可以获取到。

在构建 MPFR 时,需要通过 --with-gmp=/opt/gmp-6.1.0,为 MPFR 指定 GMP 所在的位置。构建好 MPFR 后,就可以开始构建 GDB 了。需要通过使用:

./configure --prefix=/opt/gdb-14.2 CFLAGS="-I/opt/mpfr-3.1.6/include -L/opt/mpfr-3.1.6/lib -I/opt/gmp-6.1.0/include -L/opt/gmp-6.1.0/lib" CXXFLAGS="-I/opt/mpfr-3.1.6/include -L/opt/mpfr-3.1.6/lib -I/opt/gmp-6.1.0/include -L/opt/gmp-6.1.0/lib"

为 GDB 指定其所需的 GMP、MPFR 库文件和头文件。随后运行:

make
make check
sudo make install

参考:

  1. How To Install GCC on CentOS 7

  2. Intro to ‘make’ Linux Command: Installation and Usage

  3. centos7升级glibc2.28

  4. 下载最新的glibc库并临时使用,而不污染原有系统环境

  5. GCC and linking environment variables and flags

  6. gmp is missing while configuring building gdb from source

Last change: 2024-10-12, commit: 381dc80