/usr/lib/libstdc++.so.6: versi `GLIBCXX_3.4.15 'tidak ditemukan


135

Bagaimana saya bisa mendapatkan GLIBCXX_3.4.15 di Ubuntu? Saya tidak dapat menjalankan beberapa program yang sedang saya kompilasi.

Ketika saya melakukan:

strings /usr/lib/libstdc++.so.6 | grep GLIBC

Saya mendapat:

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

Terima kasih atas bantuannya!

Jawaban:


81

Saya mengkompilasi gcc 4.6 dari sumber, dan rupanya

sudo make install 

tidak menangkap yang ini. Saya menggali dan menemukan

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

Saya menyalinnya ke / usr / lib dan mengalihkan libstdc ++. So.6 untuk menunjuk ke yang baru, dan sekarang semuanya berfungsi.


1
Ini bekerja dengan gcc 4.6.2 juga kecuali libstdc ++. So.6.0.16. Terima kasih!
Venesectrix

2
Milik saya adalah gcc 4.7 dan libstdc ++. So.6.0.17. Punya masalah yang sama, diperbaiki dengan solusi ini. Pujian.
Ricbit

1
Ya ada. Sebuah apt-getsolusi berbasis untuk masalah ini dijelaskan di sini: superuser.com/questions/310809/...
aroth

1
Kesalahan timpang ini telah menyiksa pengguna CENTOS / Ubuntu / Linux untuk sementara waktu sekarang. Dan mengapa tepatnya para pengembang OS ini tidak repot-repot memperbaiki atau memperbarui ?? Terima kasih atas perbaikannya btw :)!
roosevelt

4
@roosevelt: ini bukan masalah dengan OS, ini masalah dengan pengguna yang menginstal perangkat lunaknya sendiri, lalu tidak menggunakan linker dengan benar. Ini FAQ: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely

54

Saya telah menghindari masalah ini di masa lalu hanya dengan menautkan libstdc ++ secara statis dengan parameter ini yang dikirim ke g ++ saat menautkan file yang dapat dieksekusi:

-static-libstdc++

Jika menautkan di perpustakaan secara statis adalah opsi, ini mungkin solusi tercepat.


Masalahnya adalah bahwa perpustakaan tidak dapat ditemukan, bukan Anda harus menautkan secara statis. Lihat jawaban dari @Hobo.
Dan Mergens

47

Saya mencoba untuk mendapatkan dentang untuk bekerja (yang juga membutuhkan 6.0.15), dan ketika melihat-lihat saya menemukan itu telah dipasang di /usr/local/lib/libstdc++.so.6.0.15. Itu dipasang di sana ketika saya menginstal grafit (versi gcc eksperimental).

Jika Anda memerlukan akses ke perpustakaan di lokasi itu, maka Anda harus mendefinisikan LD_LIBRARY_PATHsebagai:

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

Saya bisa mendapatkan dentang untuk bekerja setelah melakukan ini. Semoga bermanfaat bagi seseorang.


Saya sedang mengerjakan target yang disematkan dan saya mendapatkan masalah yang sama, solusi Anda tampaknya tidak berfungsi dalam kasus saya. Faktanya, sebagian besar biner dalam target menggunakan pustaka c default di / lib, jadi perubahan LD_LIBRARY_PATHakan memengaruhi mereka. mereka semua akan menautkan ke perpustakaan baru, Pada akhirnya sebagian besar binari tidak berfungsi: seperti ls grep, ....: Saya mendapatkan:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin

14

Saya mengalami masalah ini ketika mencoba menggunakan matlab eng untuk memanggil fungsi m dari kode c. yang terjadi dengan perintahmex -f .. ..

Solusi saya:

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

Saya menemukan itu mencakup 3.4.15

jadi sistem saya memiliki libs terbaru.

masalahnya berasal dari matlab itu sendiri, ia memanggil libstdc ++. so.6-nya sendiri dari {MATLAB}/bin

jadi, ganti saja dengan lib sistem yang diperbarui.


Ini sepertinya juga berfungsi untuk saya di Matlab 2013b x64 di Xubuntu 13.04 x64
Marcin

Terima kasih banyak. Saya hanya perlu membuat tautan simbolik baru untuk file tersebut {MATLAB}/binke dalam file /usr/lib/, dan kemudian memulai ulang matlab. Ini berfungsi di Matlab 2010b pada Fedora 14 x64.
Wajan

2

Saya mendapat kesalahan yang sama. Beginilah cara kerjanya untuk saya:

  • membersihkan proyek di bawah gcc yang saat ini diinstal
  • mengkompilasi ulang itu

Bekerja dengan sempurna!


2

Untuk kesalahan ini, saya menyalin libstdc ++. So.6.0.17 terbaru dari server lain, dan menghapus tautan lunak dan membuatnya kembali.

1. Salin libstdc ++. So.6.0.15 atau yang terbaru dari server lain ke sistem yang terpengaruh.
Dalam kasus saya SUSE linux 11 SP3 memiliki versi terbaru.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (di bawah direktori / usr / lib64).

nJoy


2

Saya baru saja menghadapi masalah serupa dalam membangun versi LLVM 3.7. pertama periksa apakah Anda telah menginstal perpustakaan yang diperlukan di sistem Anda:

$locate libstdc++.so.6.*

Kemudian tambahkan lokasi yang ditemukan ke variabel lingkungan $ LD_LIBRARY_PATH Anda.


2
Ini hanya berfungsi, jika Anda memiliki libstdc ++. So.6. * Lib dengan dukungan
GLIBCXX_3.4.15

2

Terkadang Anda tidak mengontrol mesin target (misalnya pustaka Anda perlu dijalankan pada sistem perusahaan yang dikunci). Jika demikian, Anda perlu mengompilasi ulang kode Anda menggunakan versi GCC yang sesuai dengan versi GLIBCXX mereka. Jika demikian, Anda dapat melakukan hal berikut:

  1. Cari GLIBCXX versi terbaru yang didukung oleh mesin target: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Katakanlah versinya adalah3.4.19 .
  2. Gunakan https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html untuk menemukan versi GCC yang sesuai. Dalam kasus kami, ini adalah [4.8.3, 4.9.0).

1

gcc versi 4.8.1, kesalahannya tampak seperti:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: versi `GLIBCXX_3.4.15 'tidak ditemukan (diperlukan oleh / root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

Saya menemukan libstdc ++. So.6.0.18 di tempat saya memenuhi gcc 4.8.1

Lalu saya melakukan seperti ini

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

masalah terpecahkan.


1

Saya telah mengekstraknya dari RPM ( RPM untuk libstdc ++ ) dan kemudian:

export LD_LIBRARY_PATH=.

Untuk mengatur sistem untuk mencari perpustakaan di direktori saat ini. Kemudian jalankan saja program saya. Tapi dalam kasus saya, saya telah menerima satu executable yang saya butuhkan, itu bukan perubahan sistem yang luas.


0

Saya mengalami masalah serupa, dan saya telah mengatasinya dengan menautkan secara statis libstdc++ke program yang saya kompilasi, seperti:

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

bukannya biasanya

$ ./configure ... etc.

Mungkin ada masalah dengan solusi ini terkait dengan memuat pustaka bersama saat runtime, tetapi saya belum melihat masalah ini cukup dalam untuk berkomentar.



0

Saya mengalami masalah yang sama karena saya mengubah pengguna dari diri saya sendiri menjadi orang lain:

su

Untuk beberapa alasan, setelah melakukan kompilasi normal saya tidak dapat menjalankannya (pesan kesalahan yang sama). Langsung ssh ke akun pengguna lain bekerja.


Ini tidak benar-benar menjawab pertanyaan itu. Jika Anda memiliki pertanyaan yang berbeda, Anda dapat menanyakannya dengan mengklik Ajukan Pertanyaan . Anda juga dapat menambahkan hadiah untuk menarik lebih banyak perhatian pada pertanyaan ini.
ravron

Tidak, itu karena saya memiliki masalah yang persis sama. Itu disebabkan oleh perubahan pengguna. Itu juga bisa terjadi pada orang lain, katakanlah mengubah ke root.
SmallChess

Kesalahanku! Saya terlempar oleh baris pertama, yang sepertinya Anda juga punya masalah. Lanjut!
ravron

Saya juga menggunakan Ubuntu dan juga mencoba mengkompilasi program dan juga mendapat pesan kesalahan yang sama seperti dalam pertanyaan. Kesalahan saya adalah saya melakukannya di akun pengguna lain dengan menggunakan perintah su. Saya pikir ini menjawab pertanyaan karena membahas mengapa dan bagaimana masalahnya. Itu pasti kemungkinan.
SmallChess

Dan satu pengguna telah menetapkan LD_LIBRARY_PATH untuk menemukan lib yang lebih baru tetapi bukan pengguna yang lain? Tampaknya agak terlalu dibuat-buat dalam konteks spesifik pertanyaan ini.
Marc Glisse

0

Saya memiliki beberapa versi kompiler gcc yang diinstal dan perlu menggunakan versi yang lebih baru daripada penginstalan default. Karena saya bukan administrator sistem untuk sistem Linux kami, saya tidak bisa begitu saja mengubah / usr / lib atau banyak saran lain di atas. Saya mengalami masalah ini dan akhirnya melacaknya untuk mengatur jalur saya ke direktori perpustakaan 32-bit alih-alih direktori perpustakaan 64-bit (lib64). Karena pustaka di direktori 32-bit tidak kompatibel, sistem secara default menggunakan versi lama yang kedaluwarsa.

Menggunakan -L ke jalur yang saya referensikan memberi peringatan tentang "melewatkan libstdc ++ yang tidak kompatibel. Jadi ketika mencari -lstdc ++". Ini adalah petunjuk yang akhirnya membantu saya menyelesaikan masalah.


0

Hal yang sama dengan versi gcc 4.8.1 (GCC)dan libstdc++.so.6.0.18. Harus menyalinnya di sini /usr/lib/x86_64-linux-gnudi kotak ubuntu saya.


0

Dalam kasus saya LD_LIBRARY_PATH memiliki / usr / lib64 dulu sebelum / usr / local / lib64. (Saya sedang membangun llvm 3.9).
Kompiler gcc baru yang saya instal untuk mengkompilasi llvm 3.9 memiliki pustaka yang menggunakan pustaka GLIBCXX yang lebih baru di bawah / usr / local / lib64 Jadi saya memperbaiki LD_LIBRARY_PATH agar linker dapat melihat / usr / local / lib64 terlebih dahulu.
Itu memecahkan masalah ini.


0

Saya baru saja menggunakan -static-libstdc ++ saat membangun. w / itu, saya bisa menjalankan a.out

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

0

Untuk tujuan pengujian:

Di mesin asli, temukan pustaka, salin ke direktori yang sama dengan yang dapat dieksekusi:

$ 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 .

Kemudian salin pustaka yang sama ini ke mesin target, dan jalankan yang dapat dieksekusi:

LD_LIBRARY_PATH=. ./myexecutable

Catatan: perintah di atas bersifat sementara; ini bukan perubahan seluruh sistem.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.