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 版本
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:
- 通过yum安装
- 第一种通过替换成CentOS的yum,然后直接 yum install gcc 安装;
- 第二种通过本地镜像文件来装,用iso做一个yum库(无法联网时的办法)。 (这里的方法比较好,通过devtoolset,然后通过scl 来切换, 参考资料: https://blog.csdn.net/weixin_42744102/article/details/107219137 , 这里 的没有尝试,后续可以试试)
- 直接安装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是没有问题的呢。。 先把坑留在这个位置吧。
参考资料
- https://blog.csdn.net/zhouzme/article/details/19577885
- http://c.biancheng.net/gcc/ (超赞)
- https://blog.csdn.net/furzoom/article/details/53322510
- https://www.cnblogs.com/aquester/p/9891584.html
- http://blog.chinaunix.net/uid-14735472-id-5214282.html
- http://www.cnblogs.com/freeweb/p/5990860.html
- https://blog.csdn.net/jianm_liu/article/details/78316690
- https://blog.csdn.net/u010977122/article/details/100708274
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn