项目开放过程中,要使用第三方公司的库,他们是在ubuntu18.04上编译的,使用的是glibc2.28版本。
目前本公司的环境是centos7,glibc是2.17版本。因此,要使用第三方的库,就得升级本公司的glibc。
进行glibc的编译前,需要一些准备工作。
解压glibc 后,阅读INSTALL文件,查看需要升级或者安装一些依赖软件。
本机上,gcc 和make 需要手动安装。
其他的yum 安装,就符合版本要求了,yum install texinfo python3 bison libselinux-devel audit-devel gd-devel
gcc需要安装4.9以上的版本,make需要安装4.0以上的版本。
gcc的安装
centos7默认的gcc版本是4.8.5,需要安装大于4.9以上的版本。
gcc4.8已完全支持c++11
gcc6.1已完全支持c++14
gcc7以上的版本完全支持c++17
因为涉及用到一些c++17的特性,故下载gcc7.5.0版本。
tar -xvf gcc-7.5.0.tar.gz
cd gcc-7.5.0
./contrib/download_prerequisites 下载几个依赖包。
不能下载的,可以用wget下载tar包放在gcc-7.5.0下面。
wget https://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.5.0.tar.gz wget https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2 wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz wget http://isl.gforge.inria.fr/isl-0.18.tar.bz2
再执行下./contrib/download_prerequisites
./configure --prefix=/opt/gcc_build/ --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j10
make install
或者自己编译这些,如下图:
1.安装gmp
tar -xvf gmp-6.1.2.tar.bz2
cd gmp-6.1.2
./configure --prefix=/home/gmp_build
make -j
make install
2.安装mpfr
tar -zxvf mpfr-3.1.5.tar.gz
cd mpfr-3.1.5
./configure --prefix=/home/mpfr_build --with-gmp=/home/gmp_build
make -j
make install
3.安装mpc
tar -zxvf mpc-1.0.3.tar.gz
cd mpc-1.0.3
./configure -prefix=/home/mpc_build -with-gmp=/home/gmp_build -with-mpfr=/home/mpfr_build
make -j
make install
4.安装isl
tar -xvf isl-0.18.tar.bz2
cd isl-0.18
./configure --prefix=/home/isl_build --with-gmp=/home/gmp_build
make
make install
5.安装gcc
tar -zxvf gcc-7.5.0.tar.gz
cd gcc-7.5.0
./configure --prefix=/home/gcc_build --enable-checking=release --enable-languages=c,c++ --disable-multilib --with-gmp=/home/gmp_build --with-mpfr=/home/mpfr_build --with-mpc=/home/mpc_build --with-isl=/home/isl_build
export LD_LIBRARY_PATH=/home/gmp_build/lib:/home/mpc_build/lib:/home/mpfr_build/lib:/home/isl_build/lib:$LD_LIBRARY_PATH
make -j
make install
看了一些网友的博客,大多就是不配置--prefix,那么就直接安装到/usr/local下了,原先的gcc4.8.5就直接覆盖了。也不知道有没有非法覆盖?
还有就是直接拷贝到/usr/下。
还有就是建立软链接,不过之前的gcc4.8.5就没了,也没卸载。
我是写了一个脚本(就一行)
export PATH=/opt/gcc_build/bin:$PATH
把这个脚本放在/etc/proflie.d/下。
执行source /etc/profile.d/gcc7.5.0.sh
gcc -v 显示的是7.5.0版本。
安装make
make安装的是4.2.1版本
tar -xvf make-4.2.1.tar.gz
cd make-4.2.1
./configure --prefix=/opt/make_build
make -j10
make install
不费劲了,直接把生成的拷贝到/usr目录下(bin下也就一个文件)
安装glibc
glibc 是linux 底层的API库,升级失败,将导致系统异常。
我是先编译在/opt/glibc_build下,没问题,再编译到/usr下。
tar -xvf glibc-2.28.tar.gz
cd glibc-2.28/
mkdir glibc_build
cd glibc_build
../configure --prefix=/opt/glibc_build --with-headers=/usr/include --with-binutils=/usr/bin
一定要看看config.log 有什么缺的,再安装下对应的版本。
make -j10
make install
没啥问题。
../configure --prefix=/usr --with-headers=/usr/include --with-binutils=/usr/bin
make -j10
make install
如果报错
/usr/bin/perl scripts/test-installation.pl /tmp/glibc-2.31/build/
/usr/bin/ld: cannot find -lnss_test2
...
请修改scripts/test-installation.pl,新增如下内容
报错 undefined reference to '_nsl_default_nss@GLIBC_PRIVATE'
请加--enable-obsolete-nsl
../configure --prefix=/root/glibc_build --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl
make -j10
make install
我的成功了
你们呢?