1. 程式人生 > >升級gcc後出現錯誤:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found

升級gcc後出現錯誤:/usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found

升級gcc後,今天用g++編譯一個c++程式時出現一個錯誤,如下: ./destructor: /usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./destructor) 經過網上查詢後,發現問題是由於升級了gcc,卻沒有將升級後的gcc的動態庫去替換老版本的gcc動態庫所致。
strings /usr/lib/libstdc++.so.6 | grep CXXABI 結果如下:
  1. CXXABI_1.3
  2. CXXABI_1.3.1
  3. CXXABI_1.3.2
  4. CXXABI_1.3.3
發現最高版本只有1.3.3,沒有1.3.9的。說明出現這些問題,是因為升級
gcc時,生成的動態庫沒有替換老版本gcc的動態庫。 ls -l /usr/lib/libstdc++.so.6
  1. lrwxrwxrwx.1 root root 19Apr717:57/usr/lib/libstdc++.so.6-> libstdc++.so.6.0.13
我們發現libstdc++.so.6是個軟連線,是連線到libstdc++.so.6.0.13上的,而libstdc++.so.6.0.13是老版本的動態庫。所以下面我們要做的就是將libstdc++.so.6連線到新版本的動態庫上去。
b. 執行以下命令,查詢編譯gcc時生成的最新動態庫:
  1. find /-name
    "libstdc++.so.*"
結果如下:
  1. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
  2. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/prev-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
  3. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.
    6.0.22
  4. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/stage1-i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
  5. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
  6. /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
  7. /usr/local/lib/libstdc++.so.6.0.22
  8. /usr/local/lib/libstdc++.so.6.0.22-gdb.py
  9. /usr/local/lib/libstdc++.so.6
  10. /usr/lib/libstdc++.so.6.0.13
  11. /usr/lib/libstdc++.so.6
其中/usr/local/src/gcc-build-6.3.0是我們升級gcc時的輸出目錄,libstdc++.so.6.0.22就是我們的新版本的動態庫。
c. 將上面的最新目錄複製到/usr/lib/目錄下:
  1. cp /usr/local/src/gcc-6.3.0/gcc-build-6.3.0/i686-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22/usr/lib/
d. 將libstdc++.so.6連線到libstdc++.so.6.0.22上去:
  1. cd /usr/lib
  2. rm -rf libstdc++.so.6
  3. ln -s libstdc++.so.6.0.22 libstdc++.so.6
e. 預設動態庫升級完成。重新執行以下命令檢查動態庫:
  1. strings /usr/lib/libstdc++.so.6| grep 'CXXABI'
結果如下:
  1. CXXABI_1.3
  2. CXXABI_1.3.1
  3. CXXABI_1.3.2
  4. CXXABI_1.3.3
  5. CXXABI_1.3.4
  6. CXXABI_1.3.5
  7. CXXABI_1.3.6
  8. CXXABI_1.3.7
  9. CXXABI_1.3.8
  10. CXXABI_1.3.9
  11. CXXABI_1.3.10
  12. CXXABI_TM_1
  13. CXXABI_FLOAT128
可看到確實是連線到新的動態庫上去了。完成!