情景如下:
CentOS7, python3, 以及python3的pip(命名为pip3)
执行 pip3 install sxtwl 时,报错: 省略N字......-std=c++11 , 总之就是不支持-std=c++11
查阅资料,需要升级gcc,yum只到4.8.5版本, 只好编译安装, 目前最新已经9.x了, 我下载的6.1.0
下载gcc源码
这里下载的bz包,大家也可以下载gz包,
- 下载安装 bzip解压工具,后面会用到(即使你下载的gz包,也要安装此软件,make 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 就能正常安装了