linux升级gcc

摘要:
这是因为在升级gcc时,生成的动态库不会替换旧版本gcc的动态库。要解决此问题,请用系统中的旧版本动态库替换gcc的最新版本动态库。

情景如下:

  • CentOS7, python3, 以及python3的pip(命名为pip3)

  • 执行 pip3 install sxtwl 时,报错: 省略N字......-std=c11 , 总之就是不支持-std=c11

  • 查阅资料,需要升级gcc,yum只到4.8.5版本, 只好编译安装, 目前最新已经9.x了, 我下载的6.1.0

下载gcc源码

yum -y install bzip2.x86_64   
  • 解压
tar -jxvf gcc-6.1.0.tar.bz2

下载供便利需要的依赖项

cd gcc-6.1.0

./contrib/download_prerequisites 

sudo yum install  gmp  gmp-devel  mpfr  mpfr-devel  libmpc  libmpc-devel

建立一个目录供编译出的文件存放

mkdir gcc-build-6.1.0

cd gcc-build-6.1.0

生成Makefile文件

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

编译安装

make -j4
  • -j4选项是make对多核处理器的优化,如果不成功请使用 make,这里我使用的make

  • (注意:此步骤如果能正常运营,则非常耗时,在我写这篇文章时,已经过40分钟了,还没完成。如果有错误的话,一般最多一两分钟就停下来了)

  • PS:如果提示还缺少其它包,请下载错误提示中包后,重新编译

比如在这个过程中,我又执行了如下两个命令安装相关依赖
yum install m4 
yum install gcc-c++
  • 再次 make

  • make install

  • 重启 ,执行 gcc -v查看版本 已经6.1.0,可以使用了

替换老版本gcc动态库

  • 源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
find / -name "libstdc++.so*"
  • 结果如下:
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/local/lib64/libstdc++.so.6.0.22
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.22-gdb.py

  • 删除并备份原文件 (注意:每个人的文件路径可能稍有差异,但文件名是一样的 )
mv /usr/lib64/libstdc++.so.6 /home/usr_lib64_libstdc++.so.6
  • 将新版本gcc动态库导入
ln -s /usr/local/lib/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6

  • 重新编译运行

  • 此时在执行 pip install sxtwl 就能正常安装了

免责声明:文章转载自《linux升级gcc》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WebService开发实例(Axis2实现,无需安装,快速实现)[Android]Android的常用adb命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Windows下用Eclipse配合CDT+MinGW编译环境的建立

Eclipse是一款用Java编写的优秀的开源'壳'软件,其自身不带编译器连接器,使用时需要自己进行编译器连接器的配置工作,可以说灵活性非常大,通过添加插件可以支持多种语言。本来大家使用Eclipse是用来写Java程序的,但是通过合理的配置,完全可以使用开源的gcc编译器来进行C,C++的编写工作。这样一来可以在Eclipse编写控制台程序、编写GTK或...

Linux根文件系统分析之init和busybox

Hi,大家好!我是CrazyCatJack。今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译。 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话。它的软件组成大概有这三部分:1)bootloader 2)嵌入式系统kernel 3)根文件系统 。这其实非常好理解,类比于PC上的操作系统,首先我们需要类似BIOS的东东...

转://Linux MultiPath多路径软件实施说明

Multipath的工作原理 当multipath启动的时候,它通过系统命令scsi_id -eg -s /block/sdX得到proc/partitions 里面所有块设备的 UUID(universally unique identify),然后把所有具有同一个UUID的块设备组成一个Group,在/dev/mapper 生产一个对应的单独的设备。当...

性能调优攻略

摘要:关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法。 关于性能优化这是一个比较大的话题,在《由12306.cn谈谈网站性能技术》中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些...

《Linux程序设计》——读书笔记(2)

Linux环境: 无论操作系统何时启动一个新程序,参数argc和argv都会被设置并传递给main(即使main函数未声明参数,此时只是不能使用这些参数)。这些参数通常由另一个程序提供,一般是shell,它要求操作系统启动该新程序。shell会接受用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组。 命令行参数在向程序传递信息方面很有用,...

基于335X的Linux网口驱动分析

基于335X的linux网口驱动分析 一、 系统构成 1、  硬件平台 AM335X 2、  LINUX内核版本 4.4.12 二、 网口驱动构架(mdio部分) mdio网口驱动部分 使用 总线、设备、驱动模型,总结如下:          若设备和驱动匹配,则执行 davinci_mdio_probe   --> mdiobus_register...