2013-05-30 12 views
9

Un po 'di tempo fa, ho deciso di eseguire l'aggiornamento a GCC 4.8 per ottenere un avvio anticipato su alcune funzionalità di C++ 11. Sono stato un po 'sviato, però, e non ho messo nessuna delle nuove funzionalità da usare fino a qualche progetto fa (il nuovo compilatore sembrava funzionare bene, ma potrebbe essere solo perché non stavo utilizzando qualsiasi nuova funzionalità.)Come configurare libstdC++ con GCC 4.8?

In questo nuovo progetto, quando ho compilato con il flag = std = C++ 11, non ho avuto problemi. Tuttavia, in fase di esecuzione, ottengo l'errore:

./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.18' not found (required by ./main)`

suppongo che ci sia un problema di collegamento ad una più moderna libreria libstdC++ associato con GCC 4.8, ma non posso per la vita di me capire come correggi questo o dove dovrebbe essere la libreria appropriata. Mi ricordo simbolico che collega il g ++ e binari gcc a gcc-4.8, che sembra funzionare, dal momento che g++ -v rendimenti:

Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/app/gcc/4.8.0/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper Target: i686-pc-linux-gnu Configured with: ./gcc-4.8.0/configure --prefix=/app/gcc/4.8.0 Thread model: posix gcc version 4.8.0 (GCC)

Un altro thread in linea mi ha portato a guardare il ldd uscita per il programma, che fatto mostrami che la struttura di directory per le librerie libstdC++ collegate era diversa dalla struttura di directory per i binari. Tuttavia, non sono riuscito a trovare le appropriate librerie libstdc++ in quest'ultimo, quindi non sono sicuro di dove cercare. L'uscita per ldd main è:

./main: /usr/lib/i386-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.18' not found (required by ./main) linux-gate.so.1 => (0xb7791000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb768e000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7662000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7644000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb749b000) /lib/ld-linux.so.2 (0xb7792000)`

non sono sicuro esattamente dove questo sta andando male, e continuerò usare Google e guardandosi intorno per le risposte, ma qualsiasi aiuto voi ragazzi potrebbe offrire sarebbe molto apprezzato. Se qualcosa non è chiaro sul problema o ho dimenticato alcune informazioni, fammelo sapere e cercherò di aggiungerlo. Grazie mille!

+0

possibile duplicato di [Collegamento g ++ 4.8 a libstdC++] (http://stackoverflow.com/questions/17220872/linking-g-4-8-to-libstdc) –

risposta

13

È necessario indicare al proprio linker dinamico (viene eseguito quando si esegue il programma) dove trovare la libreria. Impostare LD_LIBRARY_PATH sul percorso della libreria (probabilmente da qualche parte sotto /app/gcc/4.8.0/lib o qualcosa del genere).

Utilizzare find /app/gcc/4.8.0 -name "libstdc++.so.6". Aggiungi la directory al tuo LD_LIBRARY_PATH. per esempio con il percorso che ho citato:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/app/gcc/4.8.0/lib (se si sta utilizzando una shell di tipo bourne che di default su Linux).

Quindi provare a eseguire il programma.

Se funziona, probabilmente vorrai configurare il linker dinamico per cercare nella directory senza utilizzare LD_LIBRARY_PATH. Vedere man ld.so per i dettagli su come configurare il percorso.

+0

Perfetto, ha funzionato subito! Non sono sicuro del motivo per cui non ho pensato di cercare nella directory lib associata invece di spostare in/usr/lib ... il senno di poi è sempre 20/20. Comunque, grazie ancora, apprezzo molto l'aiuto! – paul

+0

http://stackoverflow.com/questions/17220872/linking-g-4-8-to-libstdc –

+0

@Guillaume Quindi come funziona ld.so? Esegui semplicemente 'ld.so --library-path/app/gcc/4.8.0/lib' da un terminale ed è sempre usato magicamente da qualsiasi parte del sistema per quell'utente, proprio come se fosse su' LD_LIBRARY_PATH' ? Se è così, perché è meglio che usare 'LD_LIBRARY_PATH'? –

Problemi correlati