Linux解決libstdc++的版本問題

錯誤日誌信息

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found。

 

系統環境

CentOS Linux release 7.6.1810 (Core)
Linux centos7 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

 

查看當前 GCC 的版本

$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.17
GLIBC_2.3.2

 

查找 libstdc++.so.6.0.21 庫文件

# 查找庫文件
$ find / -name libstdc++.so.6.0.21

# 如果libstdc++.so.6.0.21庫文件已存在,則按照下面的步驟創建軟鏈接即可
# 如果libstdc++.so.6.0.21庫文件不存在,則需要按照下面的步驟編譯新版本的GCC,然後再創建軟鏈接

 

GCC 各版本的下載地址,其中 gcc-5.2.0 對應 GLIBCXX_3.4.21 與 libstdc++.so.6.0.21,而 gcc-6.5.0 對應 GLIBCXX_3.4.22 與 libstdc++.so.6.0.22,具體下載的 GCC 版本根據自己的需要進行選擇。

編譯新版本的 GCC

# 下載文件(117M)
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.2.0/gcc-5.2.0.tar.bz2

# 解壓文件
$ tar -xvf gcc-5.2.0.tar.bz2

# 進入解壓目錄
$ cd gcc-5.2.0

# 下載編譯gcc所需的依賴文件和庫
$ ./contrib/download_prerequisites

# 建立輸出目錄,用於存放編譯時所有產生的中間文件
$ mkdir gcc-temp

# 進入輸出目錄
$ cd gcc-temp

# 執行configure配置
$ ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

# 編譯gcc,指定編譯使用的線程數爲8,編譯耗時較長,可能需要幾個小時
$ make -j8

# 這裏爲了避免影響系統的穩定性,暫時不執行"make install"和替換系統默認版本的gcc

 

建立軟鏈接

# 進入輸出目錄
$ cd gcc-temp

# 查找編譯生成libstdc++.so庫文件,下面查找到的libstdc++.so、libstdc++.so.6都只是軟鏈接文件,libstdc++.so.6.0.21纔是真正編譯生成的庫文件
$ find . -name "libstdc++.so*"
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21

# 拷貝libstdc++.so.6.0.21庫文件到lib64目錄
$ cp ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64

# 進入lib64目錄
$ cd /usr/lib64

# 刪除舊的鏈接文件
$ rm -f libstdc++.so.6

# 創建新的鏈接文件
$ ln -s libstdc++.so.6.0.21 libstdc++.so.6

# 查看最終的libstdc++.so庫文件列表
$ ls -al /usr/lib64/libstdc++.so.6*
lrwxrwxrwx. 1 root root       19 3月  12 10:08 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x. 1 root root   991616 10月 30 14:39 /usr/lib64/libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 11485880 3月  12 10:01 /usr/lib64/libstdc++.so.6.0.21

 

驗證新的 libstdc++.so.6.0.21 庫文件是否生效

如果下面的輸出結果中,出現 GLIBCXX_3.4.21,則代表新的 libstdc++.so.6.0.21 庫文件生效。

$ strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.17
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

 

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