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/

主要有两种方式升级gcc:

  1. 通过yum安装
  • 第一种通过替换成CentOS的yum,然后直接 yum install gcc 安装;
  • 第二种通过本地镜像文件来装,用iso做一个yum库(无法联网时的办法)。 (这里的方法比较好,通过devtoolset,然后通过scl 来切换, 参考资料: https://blog.csdn.net/weixin_42744102/article/details/107219137 , 这里 的没有尝试,后续可以试试)
  1. 直接安装gcc
  • 第一种通过rpm安装(依赖包挺多的,很繁琐);
  • 第二种通过gcc压缩包安装。

3.1 gcc-10.2 (建议这个方法)

cd /data/software/gcc
wget -c https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz --no-check-certificate
tar -xzvf gcc-10.2.0.tar.gz

cd gcc-10.2.0
./contrib/download_prerequisites   

mkdir gcc-build-10.2.0
cd gcc-build-10.2.0
../configure -enable-checking=release -enable-languages=c,c++,fortran -disable-multilib --prefix=/usr/local/gcc-10.2

make -j20  #20个线程
sudo make install

产看gcc版本

gcc -v

验证编译目录(gcc-build-10.2.0)下是否存在 libstdc++.so (这里的没有操作,放在这,以防万一)

[root@c01 gcc-build-10.2.0]# find . -name "libstdc++.so*"
./prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
./prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28
./stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so


## 进入libstdc++.so配置目录cd /usr/lib64## 将新的libstdc++.so 拷贝到目录下

cp /root/gcc-build-10.2.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.28 .

## 备份 mv libstdc++.so.6 libstdc++.so.6.old
## 创建新软连 ln -sv libstdc++.so.6.0.28 libstdc++.so.6

修改环境变量:

vim /etc/profile

#gcc
export PATH=/usr/local/gcc-10.2/bin/:$PATH
export CC=/usr/local/gcc-10.2/bin/gcc
export CXX=/usr/local/gcc-10.2/bin/g++##
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc-10.2/lib64/

环境变量生效:

source /etc/profile

查看版本:

[root@c01 gcc-build-10.2.0]# gcc --version
gcc (GCC) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

3.2 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,成功!

四、报错

报错1:

g++: 错误:unrecognized command line option ‘-std=c++14’

解决方法:

升级gcc

版本对应关系:

C++17:
    gcc7完全支持,gcc6和gcc5部分支持,gcc6支持度当然比gcc5高,gcc4及以下版本不支持。
C++14:
    gcc5就可以完全支持,gcc4部分支持,gcc3及以下版本不支持。
C++11:
    gcc4.8.1及以上可以完全支持。gcc4.3部分支持,gcc4.3以下版本不支持。

高版本的gcc向下兼容,支持低版本的C++标准。

五、讨论

PS:

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

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn