version `CXXABI_1.3.8' not found 的解決方案

絕命一擊 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

  1. 安裝依賴庫 yum install -y gmp-devel mpfr-devel libmpc-devel
  2. 下載源碼包 ftp://ftp.gnu.org/gnu/gcc/gcc-9.2.0/
  3. 解壓縮
  4. configure
  5. 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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章