目录
1,先安装高版本gcc
2,安装gcc4.8.5
2.1,下载gcc4.8.5源码
2.2,编译&&安装
3,建立gcc的软连接
4,编译gcc4.8.5中的错误
4.1,错误1
4.2,错误2
4.3,错误3
4.4,错误4
4.5,错误5
4.6,错误6
本人搭建工作站的时候,vcs需要使用到gcc,而且高版本的还不行,故在centos8中安装gcc4.8.5。
安装gcc4.8.5的时候还需要使用gcc来编译,所以需要先安装一个默认版本的gcc,然后再通过这个默认的gcc去编译gcc4.8.5,才能完成安装。
在terminal中通过如下命令可以看到目前是否安装了gcc,而且可以看到gcc的版本。
gcc -v
没有安装的就可以通过安装“Development Tools”来进行一起安装。默认的CentOS存储库包含一个名为“Development Tools”的软件包组,其中包括GNU编译器集合,GNU调试器以及编译软件所需的其他开发库和工具。
GNU编译器集合(GCC)是C,C ++,Objective-C,Fortran,Ada,Go和D编程语言的编译器和库的集合。许多开源项目,包括Linux内核和GNU工具,都是使用GCC编译的。
在ternimal中通过如下命令安装,然后再通过gcc -v即可看到安装的gcc版本。
sudo dnf group install "Development Tools" gcc -v g++ -v
我安装后gcc和g++都为8.4.1版本
下载速度较慢
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
下载完成后还需要下载依赖包。编译安装 GCC 需要依赖 mpc,mpfr,gmp包。好在 GCC 源码里自带脚本可以轻松下载依赖包。
tar zxf gcc-4.8.5.tar.gz cd gcc-4.8.5 ./contrib/download_prerequisites
在gcc-4.8.5目录下新建一个编译目录,然后进行编译。 --prefix 参数代表后续安装的地方,我选择后续安装到/usr/local/gcc4.8.5。make过程中的错误全部放在第四节。
mkdir gcc-build-4.8.5 cd gcc-build-4.8.5 ../configure --prefix=/usr/local/gcc4.8.5 --enable-checking=release --enable-languages=c,c++ --disable-multilib make make install
【注意】 下面操作gcc与g++的处理一样,g++就不再重复。
安装完成后,可以通过gcc -v看到gcc还是8.4.1版本,这是因为系统默认使用的就是/usr/bin/gcc,which gcc可以看到目前系统使用的gcc的位置,然后查找系统中安装的所有gcc。
which gcc sudo fine / -name gcc
通过/usr/bin/gcc -v即可以看到该gcc的版本,我安装的4.8.5版本位于/usr/local/gcc4.8.5/bin/gcc
cd /usr/bin/ mv gcc gcc8.4.1 mv g++ g++8.4.1 ln -snf /usr/local/gcc4.8.5/bin/gcc ./gcc ln -snf /usr/local/gcc4.8.5/bin/g++ ./g++
然后通过gcc -v即可看到gcc为4.8.4版本了。
在使用新版本(8.4.1)的gcc编译老版本(4.8.5)的过程中,会有很多错误,我遇到过的都整理如下
cfns.gperf:101:1: error: 'const char* libc_name_p(const char*, unsigned int)' redeclared inline
通过修改gcc4.8.5源码解决。按照下面网页中的修改即可,+代表增加,-代表删除。主要修改cfns.gperf、cfns.h、except.c、Make-lang.in这几个文件。参考:
https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=ec1cc0263f156f70693a62cf17b254a0029f4852
In file included from ../../../../libgcc/unwind-dw2.c:405:0: ./md-unwind-support.h: In function ‘x86_fallback_frame_state’: ./md-unwind-support.h:141:18: error: field ‘uc’ has incomplete type struct ucontext uc;
找到gcc-build-4.8.5/x86_64-unknown-linux-gnu/libgcc/md-unwind-support.h文件,在61行和141行将struct ucontext改成struct ucontext_t即可。
参考:https://blog.xuegaogg.com/posts/105/
/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/./gcc/cc1plus: /usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/./gcc/cc1plus)
查看支持的CXXABI版本:
strings /usr/lib64/libstdc++.so.6 | grep CXXABI
发现其支持CXXABI_1.3.9,但是编译的时候使用的/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 是不支持 CXXABI_1.3.9的。
删除gcc-4.8.5源码中的libstdc++.so.6,然后建立软连接link到/usr/lib64/libstdc++.so.6
cd ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/ rm -rf libstdc++.so.6 ln -snf /usr/lib64/libstdc++.so.6 ./libstdc++.so.6
../../../../gcc-host/libsanitizer/asan/asan_linux.cc: In function 'bool __asan::AsanInterceptsSignal(int)': ../../../../gcc-host/libsanitizer/asan/asan_linux.cc:222:20: error: 'SIGSEGV' was not declared in this scope return signum == SIGSEGV && common_flags()->handle_segv;
在asan_linux.cc中添加头文件#include 即可
#include <signal.h>
参考:https://bugs.busybox.net/show_bug.cgi?id=10061
参考:https://www.mail-archive.com/gcc-patches@gcc.gnu.org/msg159613.html
../../../../libsanitizer/tsan/tsan_platform_linux.cc: In function ‘int __tsan::ExtractResolvFDs(void*, int*, int)’: ../../../../libsanitizer/tsan/tsan_platform_linux.cc:295:16: error: ‘statp’ was not declared in this scope __res_state *statp = (__res_state*)state; ^ ../../../../libsanitizer/tsan/tsan_platform_linux.cc:295:37: error: expected primary-expression before ‘)’ token __res_state *statp = (__res_state*)state; ^ ../../../../libsanitizer/tsan/tsan_platform_linux.cc:295:38: error: expected ‘;’ before ‘state’ __res_state *statp = (__res_state*)state;
将第一行代码修改为第二行代码
__res_state *statp = (__res_state*)state; struct __res_state *statp = (struct __res_state*)state;
编译和安装过程中可能会遇到,可以忽略。这时候可以看到已经有/usr/local/4.8.5目录了,安装成功。
make[7]: Entering directory '/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/32/libatomic' Making all in testsuite make[8]: Entering directory '/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/32/libatomic/testsuite' make[8]: Nothing to be done for 'all'. make[8]: Leaving directory '/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/32/libatomic/testsuite' make[8]: Entering directory '/usr/local/gcc_package_4.8.5/gcc-4.8.5/gcc-build-4.8.5/x86_64-unknown-linux-gnu/32/libatomic'
参考文章:
如何在CentOS 8上安装GCC开发工具(Development Tools)_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)
CentOS 7.6对gcc版本降级_xzz3493的博客-CSDN博客_centos gcc降级
CentOS升级gcc4.8.5_fydsw1314的专栏-CSDN博客
ubuntu16.04安装gcc5.4.0问题记录(实测)_HeyMountain的博客-CSDN博客