想装高版本gcc,yum install搞不定,只好源码编译,以下是编译过程,以及排查并解决问题的过程。
centos源码编译高版本gcc
{
1 下载
wget http://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz
2 解压
tar -xf gcc-13.2.0.tar.gz
3 定位到目录
cd gcc-13.2.0
4 下载所需的支持库
./contrib/download_prerequisites
5 创建编译目录
cd ..
mkdir gcc-13.2.0-objdir
cd gcc-13.2.0-objdir
6 配置
../gcc-13.2.0/configure --prefix=/opt/gcc-13.2.0 --enable-languages=c,c++,fortran --disable-multilib
7 编译
make -j 8
报错:collect2: 错误:ld 以信号 9 [已杀死] 退出。
make[3]: *** [lto-dump] 错误 1
排查问题的过程
{
问题1:链接的时候为什么会被杀死?
再次编译
make -j 8
报错:xgcc: fatal error: cannot execute ‘cc1plus’: execvp: 没有那个文件或目录
问题2:为什么不能执行cc1plus?
问题3:cc1plus是什么?
使用find命令找到cc1plus
find / -name cc1plus
/home/bibo/Downloads/gcc-13.2.0-objdir/gcc/cc1plus
查看它的执行权限
ls -la /home/bibo/Downloads/gcc-13.2.0-objdir/gcc/cc1plus
发现没有执行权限,于是给执行权限
chmod a+x /home/bibo/Downloads/gcc-13.2.0-objdir/gcc/cc1plus
再次编译
make -j 8
依然报错,说cc1plus格式不正确,说明cc1plus文件内容有问题。
回答问题3:cc1plus是g++实际执行的更底层的编译程序。
回答问题2:cc1plus在链接的时候没有完整的生成,只是生成了一部分,然后ld就被系统干掉了。
再次编译的时候,make并不能识别上次的错误,直接认为cc1plus已生成,开始自测试。
cc1plus没有完整生成,并且没有给执行权限,于是就报了不能执行cc1plus的错误。
问题4:cc1plus为什么没有完整生成?
回答问题4:因为之前链接的时候ld被系统杀死了。
现在回到了问题1。
清理编译产生的中间文件
make clean
继续编译
make -j 8
问题1重现
清理
make clean
编译
make -j 4
问题1再次重现
清理
make clean
再开一个cmd
实时监控cpu和内存
top -i
回到第一个cmd继续编译
make -j 4
发现编译的过程中内存确实太低,并且问题1重现
查看虚拟机内存,竟然只给了2G,难怪不够用。
于是关闭虚拟机,将2G内存改为8G,并且cpu由4核改为8核。
开启虚拟机重现编译
make -j 8
查看编译结果
echo $?
显示0,说明这次编译成功了。
说明遇到的第一个问题是问题的关键,越后面遇到的问题的提示跟问题的本质相关性越低。
回答问题1:内存不够用,而ld链接时占用大量内存,被系统干掉了。系统给它发了信号9。
}
8 安装
make install
9 验证安装
gcc -v
显示:线程模型:posix
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
说明此时实际执行的gcc还是老版本的。
将实际执行的gcc改为新编译的13.2.0的
{
查询cc1plus在哪
[root@coco gcc-13.2.0-objdir]# find / -name cc1plus
/usr/libexec/gcc/x86_64-redhat-linux/4.8.2/cc1plus
/opt/gcc-13.2.0/libexec/gcc/x86_64-pc-linux-gnu/13.2.0/cc1plus
查询gcc在哪
[root@coco gcc-13.2.0-objdir]# find / -name gcc
/usr/bin/gcc
/usr/lib/gcc
/usr/libexec/gcc
/opt/gcc-13.2.0/libexec/gcc
/opt/gcc-13.2.0/lib/gcc
/opt/gcc-13.2.0/bin/gcc
逐个查询详细信息
[root@coco gcc-13.2.0-objdir]# ls -la /usr/bin/gcc
-rwxr-xr-x. 2 root root 768608 9月 29 2020 /usr/bin/gcc
[root@coco gcc-13.2.0-objdir]# ls -la /usr/lib/gcc
总用量 4
drwxr-xr-x. 3 root root 33 9月 29 2020 .
dr-xr-xr-x. 43 root root 4096 4月 30 01:42 ..
drwxr-xr-x. 3 root root 32 4月 29 03:49 x86_64-redhat-linux
[root@coco gcc-13.2.0-objdir]# ls -la /usr/libexec/gcc
总用量 16
drwxr-xr-x. 3 root root 33 9月 29 2020 .
drwxr-xr-x. 50 root root 12288 4月 29 03:49 ..
drwxr-xr-x. 3 root root 32 4月 29 03:49 x86_64-redhat-linux
[root@coco gcc-13.2.0-objdir]# ls -la /opt/gcc-13.2.0/libexec/gcc
总用量 0
drwxr-xr-x. 3 root root 33 4月 30 12:22 .
drwxr-xr-x. 3 root root 17 4月 30 12:22 ..
drwxr-xr-x. 3 root root 20 4月 30 12:22 x86_64-pc-linux-gnu
[root@coco gcc-13.2.0-objdir]# ls -la /opt/gcc-13.2.0/lib/gcc
总用量 0
drwxr-xr-x. 3 root root 33 4月 30 12:22 .
drwxr-xr-x. 3 root root 17 4月 30 12:22 ..
drwxr-xr-x. 3 root root 20 4月 30 12:22 x86_64-pc-linux-gnu
[root@coco gcc-13.2.0-objdir]# ls -la /opt/gcc-13.2.0/bin/gcc
-rwxr-xr-x. 3 root root 7040000 4月 30 12:22 /opt/gcc-13.2.0/bin/gcc
发现只有bin目录下的是可执行文件,其他的是目录
将原来的gcc备份
mv /usr/bin/gcc /usr/bin/gcc.4.8.5.bak
将高版本gcc复制过去
cp /opt/gcc-13.2.0/bin/gcc /usr/bin/gcc
再次验证
[root@coco gcc-13.2.0-objdir]# gcc -v
使用内建 specs。
COLLECT_GCC=gcc
目标:x86_64-pc-linux-gnu
配置为:../gcc-13.2.0/configure --prefix=/opt/gcc-13.2.0 --enable-languages=c,c++,fortran --disable-multilib
线程模型:posix
支持的 LTO 压缩算法:zlib
gcc 版本 13.2.0 (GCC)
这次成功了
验证g++
依然是4.8.5
查询g++
[root@coco gcc-13.2.0-objdir]# find / -name g++
/usr/bin/g++
/opt/gcc-13.2.0/bin/g++
备份原来的g++
mv /usr/bin/g++ /usr/bin/g++.4.8.5.bak
复制新g++到原来的位置
cp /opt/gcc-13.2.0/bin/g++ /usr/bin/g++
再次验证
[root@coco gcc-13.2.0-objdir]# g++ -v
使用内建 specs。
COLLECT_GCC=g++
目标:x86_64-pc-linux-gnu
配置为:../gcc-13.2.0/configure --prefix=/opt/gcc-13.2.0 --enable-languages=c,c++,fortran --disable-multilib
线程模型:posix
支持的 LTO 压缩算法:zlib
gcc 版本 13.2.0 (GCC)
}
}