原因
使用的gcc沒有找到對應的glib庫。
每個版本的glib都會有改變,所以使用的時候必須匹配。
大部分是因爲自己編譯升級了gcc,再用新的gcc編譯程序時沒有找到當時匹配的類庫。
查找原因
報錯提示很明確了,/lib64/libstdc++.so.6
中沒有找到GLIBCXX_3.4.26
版本內容。正常情況/lib64/libstdc++.so.6
並不是具體文件,而是軟連接,可以通過ls -la
查看,大部分連接到當前目錄下的類庫,比如libstdc++.so.6.0.24
。
也可以通過如下命令查看該類庫下支持到哪個版本
strings /usr/lib64/libstdc++.so.6|grep GLIBCXX
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
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_DEBUG_MESSAGE_LENGTH
可以看到是3.4.24
,最後的編號24
與lib庫libstdc++.so.6.0.24
最後的編號是一致的。
解決方法
既然lib庫與glib版本是有規律的,所以理論上我們應該在系統中查找libstdc++.so.6.0.26
文件(或者比26更高的類庫),大部分都應該能找到,如果沒找到,要麼到網上下一個,要麼自己再編譯一遍gcc。
編譯安裝的類庫,除非特殊指明,大部分都在/usr/local/lib64/
目錄下,但是編譯查找的目錄大部分是/usr/lib64/
。所以要麼指定加載路徑爲/usr/local/lib64/
;要麼把類庫拷貝到/usr/lib64/
cp /usr/local/lib64/libstdc++.so.6.0.28 /usr/lib64/
mv /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6.0.24_bak
ln -s /usr/lib64/libstdc++.so.6.0.28 /usr/lib64/libstdc++.so.6
經過如上操作,再編譯,理論上不會再報錯