标签:gcc .. ++ 4.8 state usr gcc4.8 centos8
目录
本人搭建工作站的时候,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博客
标签:gcc,..,++,4.8,state,usr,gcc4.8,centos8 来源: https://blog.csdn.net/llxxyy507/article/details/121070257
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。