情景如下:
-
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 就能正常安裝了