目录

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。

1,先安装高版本gcc

        安装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版本

2,安装gcc4.8.5

2.1,下载gcc4.8.5源码

        下载速度较慢

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

2.2,编译&&安装

        在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

3,建立gcc的软连接

【注意】 下面操作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版本了。

4,编译gcc4.8.5中的错误

        在使用新版本(8.4.1)的gcc编译老版本(4.8.5)的过程中,会有很多错误,我遇到过的都整理如下

4.1,错误1

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

4.2,错误2

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/

4.3,错误3

/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

4.4,错误4

../../../../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

4.5,错误5

../../../../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;

4.6,错误6

        编译和安装过程中可能会遇到,可以忽略。这时候可以看到已经有/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博客

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐