絕命一擊 ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8’ not found
libstdc++.so.6 版本過低導致的
看看自己的 libstdc++.so.6
裏是否包含了 CXXABI_1.3.8
# strings /usr/lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1
果然沒有。
注意,不一定是GCC版本過低,用SCL(關於scl https://linux.cn/article-6776-1.html ) 升級GCC毛用都沒有,根本不能升級 libstdc++.so.6
所以我們要升級 libstdc++.so.6 ,順便升級GCC。如果只升級GCC(通過scl)是無效的,因爲gcc的版本高了,但是他的libstdc++是 require的 原來的 libstdc++.so.6
。
不信你看
# cat /opt/rh/devtoolset-7/root/usr/lib/gcc/x86_64-redhat-linux/7/libstdc++.so
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf64-x86-64)
INPUT ( /usr/lib64/libstdc++.so.6 -lstdc++_nonshared )
所以蛋疼了吧???
只有一個解決方法就是重新編譯GCC。
編譯GCC
- 安裝依賴庫
yum install -y gmp-devel mpfr-devel libmpc-devel
- 下載源碼包 ftp://ftp.gnu.org/gnu/gcc/gcc-9.2.0/
- 解壓縮
- configure
- make (注意,這個非常耗時,加 -j4 的意思就是4線程編譯。如果你有4核,就會佔滿,導致CPU打滿,服務報警,所以看情況用,我是直接
nohup make &
然後回家睡覺 )
這批命令如下
sudo yum install gmp-devel mpfr-devel libmpc-devel -y
cd download
wget ftp://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
xz -d gcc-9.2.0.tar.xz
tar -xf gcc-9.2.0.tar
cd gcc-9.2.0
./configure --disable-multilib --enable-languages=c,c++ --prefix=$HOME/local
make -j4
make -j install
安裝完畢後,將新安裝的路徑加入到環境變量裏。
export LD_LIBRARY_PATH=$HOME/local/lib64
可以在 ~/.bash_profile
里加上 PATH=$HOME/local/bin:$PATH
把local 放到前面,以防同時存在相同名稱bin的時候,能調用本地的bin文件
把 LD_LIBRARY_PATH=$HOME/local/lib64
也加到 .base_profile
裏,可以方便以後使用。
done.