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
,这样在执行系统工具(如:ls
、ps
)时,会报出 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
参考: