/usr/lib/libstdc++.so.6: ไม่พบเวอร์ชัน `` GLIBCXX_3.4.15 '


135

ฉันจะรับ GLIBCXX_3.4.15 ใน Ubuntu ได้อย่างไร ฉันไม่สามารถเรียกใช้บางโปรแกรมที่ฉันกำลังรวบรวมได้

เมื่อฉันทำ:

strings /usr/lib/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
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

ขอบคุณสำหรับความช่วยเหลือ!

คำตอบ:


81

ฉันกำลังรวบรวม gcc 4.6 จากแหล่งที่มาและเห็นได้ชัดว่า

sudo make install 

ฟังไม่ทัน ฉันขุดไปรอบ ๆ และพบว่า

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

ฉันคัดลอกไปที่ / usr / lib และเปลี่ยนเส้นทาง libstdc ++ ดังนั้น 6 เพื่อชี้ไปที่อันใหม่และตอนนี้ทุกอย่างใช้งานได้


1
ใช้งานได้กับ gcc 4.6.2 เช่นกันยกเว้น libstdc ++ so.6.0.16 ขอบคุณ!
Venesectrix

2
ของฉันคือ gcc 4.7 และ libstdc ++ so.6.0.17 มีปัญหาเดียวกันแก้ไขด้วยวิธีนี้ ความรุ่งโรจน์
Ricbit

1
ใช่มี. apt-getวิธีการแก้ปัญหาที่ใช้ในการแก้ไขปัญหานี้ได้อธิบายไว้ที่นี่: superuser.com/questions/310809/...
aroth

1
ข้อผิดพลาดง่อยนี้สร้างความทรมานให้กับผู้ใช้ CENTOS / Ubuntu / Linux มาระยะหนึ่งแล้ว และเหตุใดนักพัฒนาระบบปฏิบัติการเหล่านี้จึงไม่กังวลกับการแก้ไขหรืออัปเดต ?? ขอบคุณสำหรับการแก้ไข btw :)!
roosevelt

4
@roosevelt: ไม่ใช่ปัญหากับระบบปฏิบัติการ แต่เป็นปัญหากับผู้ใช้ที่ติดตั้งซอฟต์แวร์ด้วยตนเองจากนั้นไม่ได้ใช้ตัวเชื่อมโยงอย่างถูกต้อง เป็นคำถามที่พบบ่อย: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

54

ฉันหลีกเลี่ยงปัญหานี้ในอดีตโดยเพียงแค่เชื่อมโยง libstdc ++ แบบคงที่กับพารามิเตอร์นี้ที่ส่งไปยัง g ++ เมื่อเชื่อมโยงปฏิบัติการของฉัน:

-static-libstdc++

หากการเชื่อมโยงในไลบรารีเป็นตัวเลือกแบบคงที่นี่อาจเป็นวิธีแก้ปัญหาที่เร็วที่สุด


ปัญหาคือไม่พบไลบรารีไม่ใช่ว่าคุณควรลิงก์แบบคงที่ ดูคำตอบจาก @Hobo
Dan Mergens

47

ฉันพยายามทำให้เสียงดังขึ้น (ซึ่งต้องใช้ 6.0.15 ด้วย) และในขณะที่จิ้มไปรอบ ๆ ฉันพบว่ามีการติดตั้งที่/usr/local/lib/libstdc++.so.6.0.15. มันติดตั้งที่นั่นเมื่อฉันติดตั้งกราไฟท์ (เวอร์ชันทดลอง gcc)

หากคุณต้องการเข้าถึงไลบรารีในตำแหน่งนั้นคุณจะต้องกำหนดLD_LIBRARY_PATHเป็น:

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64

ฉันสามารถทำงานได้อย่างคล่องแคล่วหลังจากทำสิ่งนี้ หวังว่าจะเป็นประโยชน์กับใครบางคน


ฉันกำลังทำงานกับเป้าหมายที่ฝังอยู่และฉันได้รับปัญหาเดียวกันดูเหมือนว่าโซลูชันของคุณจะไม่ได้ผลในกรณีของฉัน ในความเป็นจริงไบนารีส่วนใหญ่ในเป้าหมายใช้ไลบรารี c เริ่มต้นใน / lib ดังนั้นการเปลี่ยนแปลงLD_LIBRARY_PATHจะส่งผลต่อพวกเขา พวกเขาทั้งหมดจะเชื่อมโยงไปยังห้องสมุดใหม่ในที่สุดไบนารีส่วนใหญ่ไม่ทำงานเช่นls grep.... : ฉันได้รับ:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
มูอิน

14

ฉันพบปัญหานี้เมื่อพยายามใช้ matlab eng เพื่อเรียกฟังก์ชัน m จากรหัส c ซึ่งเกิดขึ้นด้วยคำสั่งmex -f .. ..

วิธีแก้ปัญหาของฉัน:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

ฉันพบว่ามันมี 3.4.15

ดังนั้นระบบของฉันจึงมี libs ใหม่ล่าสุด

ปัญหามาจาก matlab เองมันเรียก libstdc ++ ของตัวเอง so.6 จาก {MATLAB}/bin

ดังนั้นเพียงแค่แทนที่ด้วย lib ระบบที่อัปเดต


ดูเหมือนว่าจะใช้ได้กับฉันใน Matlab 2013b x64 บน Xubuntu 13.04 x64
Marcin

ขอบคุณมาก. ฉันต้องสร้างลิงก์สัญลักษณ์ใหม่สำหรับไฟล์ใน{MATLAB}/binไฟล์ใน/usr/lib/จากนั้นจึงรีสตาร์ท matlab ใช้งานได้ใน Matlab 2010b บน Fedora 14 x64

2

ฉันได้รับข้อผิดพลาดเดียวกัน นี่คือวิธีการทำงานสำหรับฉัน:

  • ทำความสะอาดโครงการภายใต้ gcc ที่ติดตั้งในปัจจุบัน
  • คอมไพล์ใหม่

ทำงานได้อย่างสมบูรณ์แบบ!


2

สำหรับข้อผิดพลาดนี้ฉันได้คัดลอก libstdc ++ so.6.0.17 ล่าสุดจากเซิร์ฟเวอร์อื่นและลบซอฟต์ลิงก์และสร้างขึ้นใหม่

1. คัดลอก libstdc ++ so.6.0.15 หรือล่าสุดจากเซิร์ฟเวอร์อื่นไปยังระบบที่ได้รับผลกระทบ
ในกรณีของฉัน SUSE linux 11 SP3 ล่าสุด
2. rm libstdc ++ so.6
3. ln -s libstdc ++ so.6.0.17 libstdc ++ so.6 (ภายใต้ไดเร็กทอรี / usr / lib64)

nJoy


2

ฉันเพิ่งเผชิญกับปัญหาที่คล้ายกันในการสร้างเวอร์ชัน LLVM 3.7 ก่อนอื่นให้ตรวจสอบว่าคุณได้ติดตั้งไลบรารีที่จำเป็นในระบบของคุณหรือไม่:

$locate libstdc++.so.6.*

จากนั้นเพิ่มตำแหน่งที่พบให้กับตัวแปรสภาพแวดล้อม $ LD_LIBRARY_PATH ของคุณ


2
ใช้งานได้ก็ต่อเมื่อคุณมี libstdc ++ so.6. * lib พร้อมรองรับ
GLIBCXX_3.4.15

2

บางครั้งคุณไม่ได้ควบคุมเครื่องเป้าหมาย (เช่นไลบรารีของคุณจำเป็นต้องทำงานบนระบบองค์กรที่ถูกล็อกไว้) ในกรณีนี้คุณจะต้องคอมไพล์โค้ดของคุณใหม่โดยใช้เวอร์ชันของ GCC ที่ตรงกับเวอร์ชัน GLIBCXX ในกรณีนี้คุณสามารถดำเนินการดังต่อไปนี้:

  1. เงยหน้าขึ้นมองรุ่นล่าสุดของ GLIBCXX สนับสนุนโดยเครื่องเป้าหมาย: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Say 3.4.19รุ่นคือ
  2. ใช้https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.htmlเพื่อค้นหาเวอร์ชัน GCC ที่เกี่ยวข้อง [4.8.3, 4.9.0)ในกรณีของเรานี้เป็น

1

gcc เวอร์ชัน 4.8.1 ข้อผิดพลาดดูเหมือนว่า:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: ไม่พบเวอร์ชัน `` GLIBCXX_3.4.15 '(ต้องการโดย / root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

ฉันพบ libstdc ++ so.6.0.18 ในสถานที่ที่ฉันปฏิบัติตาม gcc 4.8.1

แล้วฉันก็ทำแบบนี้

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

แก้ไขปัญหา.


1

ฉันแยกมันออกจาก RPM ( RPM สำหรับ libstdc ++ ) แล้ว:

export LD_LIBRARY_PATH=.

เพื่อตั้งค่าให้ระบบค้นหาไลบรารีบนไดเร็กทอรีปัจจุบัน จากนั้นก็รันโปรแกรมของฉัน แต่ในกรณีของฉันฉันได้รับไฟล์ปฏิบัติการเดียวที่ฉันต้องการมันไม่ใช่การเปลี่ยนแปลงทั้งระบบ


0

ฉันมีปัญหาที่คล้ายกันและฉันได้แก้ไขโดยการเชื่อมโยงแบบคงที่libstdc++ในโปรแกรมที่ฉันกำลังรวบรวมดังนี้

$ LIBS=-lstdc++ ./configure ... etc.

แทนที่จะเป็นแบบปกติ

$ ./configure ... etc.

อาจมีปัญหากับวิธีแก้ปัญหานี้เกี่ยวกับการโหลดไลบรารีที่ใช้ร่วมกันที่รันไทม์ แต่ฉันไม่ได้ตรวจสอบปัญหาอย่างละเอียดเพียงพอที่จะแสดงความคิดเห็น



0

ฉันมีปัญหาเดียวกันเนื่องจากฉันเปลี่ยนผู้ใช้จากตัวเองเป็นคนอื่น:

ซู

ด้วยเหตุผลบางประการหลังจากทำการคอมไพล์ตามปกติแล้วฉันไม่สามารถดำเนินการได้ (ข้อความแสดงข้อผิดพลาดเดียวกัน) ssh โดยตรงไปยังบัญชีผู้ใช้อื่นใช้งานได้


นี่ตอบคำถามไม่ได้จริงๆ หากคุณมีคำถามที่แตกต่างที่คุณสามารถถามได้โดยคลิกที่ถามคำถาม คุณยังสามารถเพิ่มค่าหัวเพื่อดึงดูดความสนใจให้กับคำถามนี้มากขึ้น
ravron

ไม่เป็นเพราะฉันมีปัญหาเดียวกัน มันเกิดจากการเปลี่ยนผู้ใช้ มันอาจเกิดขึ้นกับคนอื่นพูดว่าเปลี่ยนเป็นรูท
SmallChess

ความผิดพลาดของฉัน! ฉันถูกโยนทิ้งโดยบรรทัดแรกซึ่งดูเหมือนว่าคุณจะมีปัญหาเช่นกัน ดำเนินต่อไป!
ravron

ฉันยังใช้ Ubuntu และพยายามรวบรวมโปรแกรมและได้รับข้อความแสดงข้อผิดพลาดเช่นเดียวกับในคำถาม ข้อผิดพลาดของฉันคือฉันทำในบัญชีผู้ใช้อื่นโดยใช้คำสั่ง su ฉันคิดว่าสิ่งนี้ตอบคำถามได้เพราะมันกล่าวถึงสาเหตุและวิธีการเกี่ยวกับปัญหา เป็นไปได้อย่างแน่นอน
SmallChess

และผู้ใช้รายหนึ่งตั้งค่า LD_LIBRARY_PATH เพื่อค้นหา lib ที่ใหม่กว่า แต่ไม่ใช่ผู้ใช้รายอื่น ดูเหมือนจะเป็นเรื่องเล็กน้อยในบริบทเฉพาะของคำถามนี้
Marc Glisse

0

ฉันติดตั้งคอมไพเลอร์ gcc หลายเวอร์ชันและจำเป็นต้องใช้เวอร์ชันล่าสุดมากกว่าการติดตั้งเริ่มต้น เนื่องจากฉันไม่ใช่ผู้ดูแลระบบสำหรับระบบ Linux ของเราฉันจึงไม่สามารถเปลี่ยน / usr / lib หรือคำแนะนำอื่น ๆ ข้างต้นได้ ฉันพบปัญหานี้และในที่สุดก็ติดตามเพื่อกำหนดเส้นทางของฉันไปยังไดเร็กทอรีไลบรารี 32 บิตแทนที่จะเป็นไดเร็กทอรีไลบรารี 64 บิต (lib64) เนื่องจากไลบรารีในไดเร็กทอรี 32 บิตไม่สามารถใช้ร่วมกันได้ระบบจึงตั้งค่าเริ่มต้นเป็นเวอร์ชันเก่าซึ่งล้าสมัย

การใช้ -L ไปยังเส้นทางที่ฉันอ้างถึงให้คำเตือนเกี่ยวกับ "การข้าม libstdc ++ ที่เข้ากันไม่ได้ดังนั้นเมื่อค้นหา -lstdc ++" นี่เป็นคำใบ้ที่ช่วยให้ฉันแก้ไขปัญหาได้ในที่สุด


0

สิ่งเดียวกันกับเวอร์ชัน gcc 4.8.1 (GCC)และlibstdc++.so.6.0.18. ต้องคัดลอกที่นี่/usr/lib/x86_64-linux-gnuในกล่อง Ubuntu ของฉัน


0

ในกรณีของฉัน LD_LIBRARY_PATH มี / usr / lib64 ก่อนหน้า / usr / local / lib64 (ฉันกำลังสร้าง llvm 3.9)
คอมไพเลอร์ gcc ใหม่ที่ฉันติดตั้งเพื่อคอมไพล์ llvm 3.9 มีไลบรารีที่ใช้ไลบรารี GLIBCXX ที่ใหม่กว่าภายใต้ / usr / local / lib64 ดังนั้นฉันจึงแก้ไข LD_LIBRARY_PATH เพื่อให้ตัวเชื่อมโยงดู / usr / local / lib64 ก่อน
ที่ช่วยแก้ปัญหานี้


0

ฉันเพิ่งใช้ -static-libstdc ++ ในขณะที่สร้าง ฉันสามารถเรียกใช้ a.out ได้

g++ test.cpp -static-libstdc++

0

สำหรับวัตถุประสงค์ในการทดสอบ:

บนเครื่องเดิมค้นหาไลบรารีคัดลอกไปยังไดเร็กทอรีเดียวกันกับไฟล์ปฏิบัติการ:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

จากนั้นคัดลอกไลบรารีเดียวกันนี้ไปยังเครื่องเป้าหมายและเรียกใช้ไฟล์ปฏิบัติการ:

LD_LIBRARY_PATH=. ./myexecutable

หมายเหตุ: คำสั่งด้านบนเป็นแบบชั่วคราว ไม่ใช่การเปลี่ยนแปลงทั้งระบบ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.