/usr/lib/libstdc++.so.6: versione `GLIBCXX_3.4.15 'non trovata


135

Come posso ottenere GLIBCXX_3.4.15 in Ubuntu? Non riesco a eseguire alcuni programmi che sto compilando.

Quando io faccio:

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

Ottengo:

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

Grazie per qualsiasi aiuto!

Risposte:


81

Sto compilando gcc 4.6 dalla fonte, e apparentemente

sudo make install 

non l'ho preso. Ho scavato e trovato

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

L'ho copiato in / usr / lib e ho reindirizzato libstdc ++. So.6 per puntare a quello nuovo, e ora tutto funziona.


1
Ho lo stesso problema e questo post / risposta è esattamente quello che sto cercando. Molte grazie!
yoco,

1
Funziona anche con gcc 4.6.2 tranne per il fatto che è libstdc ++. So.6.0.16. Grazie!
Venesectrix,

2
Il mio è gcc 4.7 e libstdc ++. So.6.0.17. Ha avuto lo stesso problema, risolto con questa soluzione. Complimenti.
Ricbit

1
Si C'è. Una apt-getsoluzione basata su questo problema è descritta qui: superuser.com/questions/310809/…
aroth

4
@roosevelt: non è un problema con il sistema operativo, è un problema con gli utenti che installano il software da soli, quindi non usano correttamente il linker. È una FAQ: gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
Jonathan Wakely,

54

In passato ho evitato questo problema semplicemente collegando staticamente libstdc ++ con questo parametro inviato a g ++ durante il collegamento del mio eseguibile:

-static-libstdc++

Se il collegamento statico nella libreria è un'opzione, questa è probabilmente la soluzione più rapida.


2
Grazie mille, ho provato ogni altra soluzione suggerita su SO e niente ha funzionato tranne questo.
Itamar Katz,

1
Grazie per la tua soluzione, mi aiuta molto!
Brightshine,

Il problema è che non è possibile trovare la libreria, non è necessario collegarsi staticamente. Vedi la risposta da @Hobo.
Dan Mergens,

45

Stavo cercando di far funzionare clang (che richiede anche 6.0.15), e mentre cercavo in giro ho scoperto che era installato su /usr/local/lib/libstdc++.so.6.0.15. Si è installato lì quando ho installato la grafite (una versione gcc sperimentale).

Se hai bisogno di accedere alle librerie in quella posizione, dovrai definire LD_LIBRARY_PATHcome:

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

Sono stato in grado di far funzionare clang dopo aver fatto questo. Spero che sia utile a qualcuno.


Stavo lavorando su un target incorporato e ho lo stesso problema, la tua soluzione sembra non funzionare nel mio caso. In effetti la maggior parte del file binario nella destinazione usa la libreria c predefinita in / lib, quindi il cambiamento LD_LIBRARY_PATHli influenzerà. si collegheranno tutti alla nuova libreria, Alla fine la maggior parte dei binari non funziona: come ls grep....: ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Sto

14

Riscontro questo problema quando provo ad usare matlab eng per chiamare le funzioni m dal codice c. che si verifica con il comandomex -f .. ..

La mia soluzione:

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

Ho scoperto che include 3.4.15

quindi il mio sistema ha le librerie più recenti.

il problema proviene dal matlab stesso, chiama libstdc ++. so.6 da {MATLAB}/bin

quindi, basta sostituirlo con la libreria di sistema aggiornata.


Questo sembra funzionare anche per me in Matlab 2013b x64 su Xubuntu 13.04 x64
Marcin

Molte grazie. Ho dovuto solo creare un nuovo collegamento simbolico per il file nel {MATLAB}/binfile /usr/lib/e quindi riavviare matlab. Funziona in Matlab 2010b su Fedora 14 x64.
Wok,

2

Ho avuto lo stesso errore. Ecco come ha funzionato per me:

  • ripulito il progetto con gcc attualmente installato
  • l'ha ricompilato

Ha funzionato perfettamente!


2

Per questo errore, ho copiato l'ultimo libstdc ++. So.6.0.17 da un altro server e rimosso il collegamento software e ricreato.

1. Copiare libstdc ++. So.6.0.15 o successivo da un altro server sul sistema interessato.
Nel mio caso SUSE Linux 11 SP3 aveva l'ultima.
2. rm libstdc ++. So.6
3. ln -s libstdc ++. So.6.0.17 libstdc ++. So.6 (nella directory / usr / lib64).

nJoy


2

Ho appena affrontato un problema simile nella creazione della versione LLVM 3.7. per prima cosa controlla se hai installato la libreria richiesta sul tuo sistema:

$locate libstdc++.so.6.*

Quindi aggiungi la posizione trovata alla tua variabile di ambiente $ LD_LIBRARY_PATH.


2
Funziona solo se hai una libstdc ++. So.6. * Lib con supporto
GLIBCXX_3.4.15

2

A volte non controlli il computer di destinazione (ad esempio, la tua libreria deve essere eseguita su un sistema aziendale bloccato). In tal caso, dovrai ricompilare il codice utilizzando la versione di GCC corrispondente alla loro versione GLIBCXX. In tal caso, è possibile effettuare le seguenti operazioni:

  1. Cerca l'ultima versione di GLIBCXX supportata dal computer di destinazione: strings /usr/lib/libstdc++.so.6 | grep GLIBC... Supponi che la versione sia 3.4.19.
  2. Usa https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html per trovare la versione GCC corrispondente. Nel nostro caso, questo è [4.8.3, 4.9.0).

1

gcc versione 4.8.1, l'errore sembra:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen: /usr/lib64/libstdc++.so.6: versione `GLIBCXX_3.4.15 'non trovata (richiesta da / root / bllvm / build / Release + Asserts / bin / LLVM-tblgen)

Ho trovato libstdc ++. So.6.0.18 nel luogo in cui ho rispettato gcc 4.8.1

Quindi mi piace così

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

problema risolto.


1

Li ho estratti da un RPM ( RPM per libstdc ++ ) e poi:

export LD_LIBRARY_PATH=.

Per impostare il sistema per la ricerca delle librerie nella directory corrente. Quindi ho appena eseguito il mio programma. Ma nel mio caso ho ricevuto un singolo eseguibile di cui avevo bisogno, non è stato un cambiamento a livello di sistema.


0

Ho avuto un problema simile e l'ho risolto collegandomi staticamente libstdc++al programma che stavo compilando, in questo modo:

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

invece del solito

$ ./configure ... etc.

Potrebbero esserci problemi con questa soluzione a causa del caricamento di librerie condivise in fase di runtime, ma non ho esaminato il problema in modo approfondito per commentare.



0

Ho avuto lo stesso problema perché ho cambiato l'utente da me stesso a qualcun altro:

su

Per qualche motivo, dopo la normale compilazione non sono stato in grado di eseguirlo (lo stesso messaggio di errore). Direttamente ssh per l'altro account utente funziona.


Questo non risponde davvero alla domanda. Se hai una domanda diversa, puoi farla facendo clic su Poni domanda . Puoi anche aggiungere una taglia per attirare maggiormente l'attenzione su questa domanda.
Ravron,

No, perché ho avuto lo stesso identico problema. È stato causato cambiando utente. Potrebbe anche essere successo a qualcun altro, diciamo cambiando a root.
HelloWorld,

Errore mio! Sono stato lanciato dalla prima riga, che sembrava che tu avessi anche il problema. Proseguire!
Ravron,

Ho anche usato Ubuntu e ho anche provato a compilare programmi e ho anche ricevuto lo stesso messaggio di errore della domanda. Il mio errore era che lo stavo facendo in un altro account utente usando il comando su. Penso che questo risponda alla domanda perché affronta il perché e il problema. È certamente una possibilità.
HelloWorld,

E un utente aveva LD_LIBRARY_PATH impostato per trovare la nuova lib ma non l'altro utente? Sembra un po 'inverosimile nel contesto specifico di questa domanda.
Marc Glisse,

0

Avevo più versioni del compilatore gcc installato e avevo bisogno di utilizzare una versione più recente rispetto all'installazione predefinita. Dato che non sono un amministratore di sistema per i nostri sistemi Linux, non posso semplicemente cambiare / usr / lib o molti altri suggerimenti sopra. Stavo riscontrando questo problema e alla fine l'ho rintracciato per impostare il mio percorso alla directory della libreria a 32 bit anziché alla directory della libreria a 64 bit (lib64). Poiché le librerie nella directory a 32 bit erano incompatibili, il sistema passava automaticamente alla versione precedente che non era aggiornata.

L'uso di -L nel percorso a cui mi riferivo dava avvertimenti su "saltare libstdc ++ incompatibile. Quindi, quando si cerca -lstdc ++". Questo è stato il suggerimento che mi ha aiutato finalmente a risolvere il problema.


0

Stessa cosa con la versione gcc 4.8.1 (GCC)e libstdc++.so.6.0.18. Ho dovuto copiarlo qui /usr/lib/x86_64-linux-gnusulla mia scatola di Ubuntu.


0

Nel mio caso LD_LIBRARY_PATH aveva / usr / lib64 prima di / usr / local / lib64. (Stavo costruendo llvm 3.9).
Il nuovo compilatore gcc che ho installato per compilare llvm 3.9 aveva librerie che utilizzavano le più recenti librerie GLIBCXX in / usr / local / lib64 Quindi ho corretto LD_LIBRARY_PATH affinché il linker vedesse prima / usr / local / lib64.
Ciò ha risolto questo problema.


0

Ho appena usato -static-libstdc ++ durante la costruzione. con quello, posso eseguire a.out

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

0

A scopo di test:

Sulla macchina originale, trova la libreria, copia nella stessa directory dell'eseguibile:

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

Quindi copia questa stessa libreria sul computer di destinazione ed esegui l'eseguibile:

LD_LIBRARY_PATH=. ./myexecutable

Nota: il comando sopra è temporaneo; non è un cambiamento a livello di sistema.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.