Linux【8】-软件管理-9-软件安装7-linux下编译安装gcc

一、gcc库简介

GCC 原来代表“GNU C Compiler”的意思。自从面世后,GCC 逐渐扩充、发展,现在不仅仅支持C语言,还支持其他很多语言,包括 C++、Ada、Objective-C、Fortran 和 Java 等。因此,GCC 的意思被重新定义为“GNU Compiler Collection”,也即“GUN 编译器套件”。

各个版本下载列表: https://ftp.gnu.org/gnu/gcc/

二、gccc库安装(如果有版本要求,可以直接跳过这个部分)

yum intall gcc

报错:

--> Finished Dependency Resolution
Error: Package: glibc-headers-2.17-260.el7_6.4.x86_64 (updates)
           Requires: kernel-headers >= 2.2.1
Error: Package: glibc-headers-2.17-260.el7_6.4.x86_64 (updates)
           Requires: kernel-headers
 You could try using --skip-broken to work around the problem

解决办法:

1.查看自己服务器的 kernel版本号

[root@c02 bin]# rpm -q kernel
kernel-3.10.0-693.el7.x86_64

2.下载对应的 kernel-headers 版本

wget -c ftp://ftp.pbone.net/mirror/ftp.centos.org/7.6.1810/virt/x86_64/xen-48/kernel-headers-4.9.75-29.el7.x86_64.rpm

3.安装 rpm 包

[root@c02 tmp]# rpm -Uvh kernel-headers-4.9.75-29.el7.x86_64.rpm
warning: kernel-headers-4.9.75-29.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 61e8806c: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:kernel-headers-4.9.75-29.el7     ################################# [100%]

4.完成!!!可以继续 yum 下去了。。。

三、gcc的升级与安装(完整版,指定版本的安装)

yum update gcc 

使用yum安装是不可能了,各大仓库也没有,只能自己编译安装了。

gcc 各种版本选择:https://ftp.gnu.org/gnu/gcc/ 我选择的是最新版的:https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/

3.1 gcc -7.5

1. 下载gcc和它依赖的gmp、mpfr和mpc
```bash
#gcc: http://mirrors.ustc.edu.cn/gnu/gcc/
wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz
#gmp:http://mirrors.ustc.edu.cn/gnu/gmp/
wget http://mirrors.ustc.edu.cn/gnu/gmp/gmp-6.1.2.tar.bz2
#mpfr:http://mirrors.ustc.edu.cn/gnu/mpfr/ 
wget http://mirrors.ustc.edu.cn/gnu/mpfr/mpfr-3.1.5.tar.bz2
#mpc:http://mirrors.ustc.edu.cn/gnu/mpc/
wget http://mirrors.ustc.edu.cn/gnu/mpc/mpc-1.0.3.tar.gz
```

2. 安装gmp
```bash
tar -jxf gmp-6.1.2.tar.bz2
cd gmp-6.1.2
mkdir temp
cd temp
../configure --prefix=/public/software/gnu/gmp/v6.1.2
make -j 4
make install
```

3. 安装mpfr
```bash
tar -jxf mpfr-3.1.5.tar.bz2
cd mpfr-3.1.5
mkdir temp
cd temp
../configure --prefix=/public/software/gnu/mpfr/v3.1.5  --with-gmp=/public/software/gnu/gmp/v6.1.2
make -j 4
make install
```

4. 安装mpc
```bash
tar -zxf mpc-1.0.3.tar.gz
cd mpc-1.0.3
mkdir temp
cd temp
../configure --prefix=/public/software/gnu/mpc/v1.0.3 --with-gmp=/public/software/gnu/gmp/v6.1.2 --with-mpfr=/public/software/gnu/mpfr/v3.1.5  
make -j 4
make install
```

5. 编译gcc
```bash
tar -zxf gcc-7.2.0.tar.gz
cd gcc-7.2.0

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-5.0.1/lib:/usr/local/mpfr-3.1.5/lib

mkdir output
cd output

../configure --prefix=/public/software/gnu/gcc/v7.2.0 --disable-multilib --with-gmp=/public/software/gnu/gmp/v6.1.2 --with-mpfr=/public/software/gnu/mpfr/v3.1.5 --with-mpc=/public/software/gnu/mpc/v1.0.3

make -j 12
make install

3.3 安装9.2版本的例子,但不建议这么弄,因为没有指定/usr/local/gcc-9.2的安装路径

1.下载解压

cd /data/software/gcc
wget -c https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz
tar -xzvf gcc-9.2.0.tar.gz  

2.下载编译依赖

cd gcc-9.2.0
./contrib/download_prerequisites   

3.生成Makefile文件

mkdir gcc-build-9.2.0
cd gcc-build-9.2.0
../configure -enable-checking=release -enable-languages=c,c++,fortran -disable-multilib

(第一遍安装的时候,因为fortran没有,所以gfortran命令没安装上。要编译那个语言,就需要在enable-languages后面加上哈)

4.编译

make -j15
15表示使用15个核心,根据你的CPU来指定。也可不指定任何参数。(这一步比较耗时间)

报错:

make[2]: Leaving directory `/mnt/nfs/data/software/gcc/gcc-9.2.0/gcc-build-9.2.0'
make[1]: *** [stage1-bubble] Error 2
make[1]: Leaving directory `/mnt/nfs/data/software/gcc/gcc-9.2.0/gcc-build-9.2.0'
make: *** [all] Error 2

解决:

yum install -y glibc-headers gcc-c++ 

然后,接着编译:

make -j15

5.安装

sudo make install

6.验证

gcc -v

还有原来的版本,重启后,再验证OK

7.测试 (这里木有写测试)

写个测试的程序测试一下:

g++ -std=c++11 -o testCpp11  testCpp11.cpp

顺利编译成功,执行./testCpp11提示:

./testCpp11: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./testCpp11)
./testCpp11: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./testCpp11)
./testCpp11: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./testCpp11)

看来动态库并没有更新。

8.更新动态库

查看动态库的版本:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

确实没有更新,默认情况下,会安装在如下目录:

/usr/local/lib64/libstdc++.so.6.0.27

简单了,将原来的库替换为上面的就可以了:

rm -rf /usr/lib64/libstdc++.so.6
ln -s /usr/local/lib64/libstdc++.so.6.0.27 /usr/lib64/libstdc++.so.6

然后再查看动态库的版本:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

结果

GLIBCXX_3.4.22

这就是刚刚安装的版本,再执行一下测试程序./testCpp11,成功!

四、报错

五、讨论

PS:

要吐血了, g01,g02,g03 上装gcc-5.3, 7.5 ,9.2 ,10.2 ,都有装成功,以前装9.2是没有问题的呢。。 先把坑留在这个位置吧。

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn

Sam avatar
About Sam
专注生物信息 专注转化医学