原文:How to fix: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
翻譯:
現(xiàn)在我急于想找到這個(gè)問題的解決辦法弯蚜,我在32位烏班圖下面嘗試編譯共享庫(在Debian和烏班圖64位下嘗試過,但是都沒有成功)
每次我嘗試加載我的插件的時(shí)候都會(huì)得到這個(gè)錯(cuò)誤:/usr/lib/libstdc++.so.6: version ``GLIBCXX_3.4.15' not found
下面是我得到這個(gè)錯(cuò)誤的方法:
1.安裝最新的32位烏班圖
2.安裝?sudo apt-get install build-essential
3.編譯并加載我的插件
下面是一些我找到并嘗試的鏈接荆姆,但是對(duì)我來說都沒有實(shí)際用途:
(我的老問題:在發(fā)布這個(gè)問題的幾天后我處理掉了它再菊,但是我忘記了我是如何操作的)
Another user with the same problem
我看到某些人移動(dòng)lidstdc++(我認(rèn)為)到一些目錄中來解決這個(gè)問題村怪,通過idk指向或者鏈接到目錄算灸,但是這讓我很疑惑。
有人知道這個(gè)問題嗎宵喂?
(第一次修改)在終端中運(yùn)行?strings /usr/lib/libstdc++.so.6 | grep GLIBC得到了:strings '/usr/lib/libstdc++.so.6': No such file亿眠,這是一個(gè)問題嗎碎罚?如果是的話,我應(yīng)該安裝哪個(gè)庫呢纳像?
(第二次修改)有人知道解決方案嗎荆烈?
(第三次修改)仍然需要一個(gè)解決方案,有沒有方法查看共享庫是在哪個(gè)發(fā)行版本上編譯的嗎竟趾?我知道我前一陣子編譯過這個(gè)庫憔购,但是我忘記了
(第四次修改)ldd my_lib_.so得到了:
linux-gate.so.1 => (0xb77d7000)
? ? libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76c1000)
? ? libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76a4000)
? ? libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74fa000)
? ? libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74ce000)
? ? /lib/ld-linux.so.2 (0xb77d8000)
ldd program_im_loading_so_into得到了:
linux-gate.so.1 => (0xb77d8000)
? ? libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb77c0000)
? ? libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb77a5000)
? ? libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb76bb000)
? ? libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb768f000)
? ? libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7672000)
? ? libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74c9000)
? ? /lib/ld-linux.so.2 (0xb77d9000)
運(yùn)行?strings /usr/lib/i386-linux-gnu/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_DEBUG_MESSAGE_LENGTH
我的gcc的版本是:
`gcc version 4.6.4 (Ubuntu/Linaro 4.6.4-1ubuntu1~12.04)`
Answers1:
使用 gcc的選項(xiàng)?-static-libstdc++宫峦,來鏈接靜態(tài)庫。
Answers2:
我通過安裝?sudo apt-get install libstdc++6解決了這個(gè)問題倦始。
在我的環(huán)境中斗遏,我安裝完??MongoDB 3.0.1遇到了這個(gè)問題:
mongo: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by mongo)
Answers3:
在非默認(rèn)的存儲(chǔ)庫中安裝最新的版本即可:
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install libstdc++6-4.7-dev
Answers4:
通過安裝最新版本的libstdc++可以解決這個(gè)問題:
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo apt-get update
$ sudo apt-get install libstdc++6-7-dbg
Answers5:
在上面,你提到編譯庫是復(fù)現(xiàn)問題的一個(gè)步驟鞋邑,但是下面你編輯說:
“有沒有方法看動(dòng)態(tài)庫實(shí)在哪個(gè)發(fā)行版本上編譯的”
對(duì)C++程序來說诵次,你是否在同一個(gè)發(fā)行版本上編譯,甚至同一發(fā)行版本的不同版本之間編譯是很重要的細(xì)節(jié)枚碗。
就像我說的逾一,鏈接C++庫包括 libstdc++會(huì)導(dǎo)致混合的結(jié)果。這里是使用不同版本的C++重新編譯的一些相關(guān)問題:
do we need to recompile libraries with c++11?
基本上肮雨,如果你在不同發(fā)行版本上編譯C++(可能還有不同的gcc版本)遵堵,這可能是引起你問題的原因。
我認(rèn)為你有兩個(gè)選擇:
1.最好的選擇:重新編譯你的共享庫怨规,如果你沒在你當(dāng)前系統(tǒng)上編譯過的話陌宿。如果這里有運(yùn)行時(shí)期系統(tǒng)環(huán)境變量的問題的話,在編譯期間可能就會(huì)出現(xiàn)波丰;
2.將你的應(yīng)用程序和其他C++編譯庫綁定在一起壳坪。如果是相同的發(fā)行版本,這可能是唯一可行的辦法掰烟。這可能是一個(gè)有用的方法如果你有自己的編譯器爽蝴。如果你使用這個(gè)方法,你必須設(shè)置LD_LIBRARY_PATH并讓它生效纫骑,在綁定上你的stdc++庫蝎亚。
Answers6:
如果有人和我遇到了一樣的問題,確定你沒有在烏班圖12.04的機(jī)器上安裝14.04的軟件包-它會(huì)給出同樣的錯(cuò)誤先馆。重新安裝合適的存儲(chǔ)庫來解決這個(gè)問題发框。
Answers7:
這對(duì)我來說是有效的:
cp /libstdc++.so.6 $PWD
./<executable>
這個(gè)解決方案來自于@kerin(上面的評(píng)論中):
你可以在這里查看到?http://stackoverflow.com/questions/13636513/linking-libstdc-statically-any-gotchas
從上面的鏈接中:
如果你把最新的libstdc++庫放到應(yīng)用程序執(zhí)行的目錄,你會(huì)發(fā)現(xiàn)在運(yùn)行的時(shí)候問題就解決了煤墙。
我得到的這個(gè)錯(cuò)誤中的 libstdc++庫在?/usr/lib64/這個(gè)目錄中缤底,但是這不是我鏈接的庫,消息看起來像:
: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by )
我確認(rèn)?LD_LIBRARY_PATH含有這個(gè)目錄(而且是第一個(gè))番捂。出于某種原因,在運(yùn)行時(shí)仍然查看?/usr/lib64/libstdc++.so.6江解。
我采取了上面的建議设预,把?libstdc++.so.6從鏈接目錄拷貝到程序運(yùn)行目錄,然后運(yùn)行程序犁河,并正常工作鳖枕。