2010-11-02 23 views
8

Ho scritto un piccolo programma che richiede alcune librerie che includono libboost_filesystem, libboost_program_options e libcurl.Il programma C++ compilato genera "impossibile aprire il file oggetto condiviso" su un altro sistema sebbene il file sia presente.

L'ho compilato sulla mia macchina di casa e ho portato il file binario al mio computer al lavoro per testarlo lì. Ma ci dà il seguente messaggio di errore quando si tenta di avviare il programma:

error while loading shared libraries: 
libboost_filesystem.so.1.42.0: cannot 
open shared object file 

Ma quando cerco questo file vedo che esiste in: /usr/lib/libboost_filesystem.so.1.42.0

Ho sbagliato qualcosa durante la compilazione/collegamento del mio programma? Se sì, cosa devo fare per farlo funzionare su altre macchine?

+1

Spesso trovo che 'ldd' può aiutarmi a scoprire cosa c'è che non va. Cosa dice 'ldd./Your_executable'? –

+1

Da quello che hai detto, sembra che dovrebbe funzionare. Potrebbe esserci un conflitto tra 32 bit e 64 bit. Prova a eseguire 'file./Your_executable' e' file/usr/lib/libboost_filesystem.so.1.42.0' per verificare che le architetture corrispondano :) –

+1

wow hai ragione. il programma è costruito come 32bit e la libreria presente è 64bit – tyrondis

risposta

1

Hai compilato i file binari condivisi di boost e li hai forniti all'utente?

Spesso boost può essere utilizzato senza alcun file binario/condiviso da fornire. Ma se usi, ad esempio, boost :: filesystem, dovrai costruire i binari, come lib o oggetti condivisi, e assicurarti che sia disponibile al percorso di ricerca binaria condiviso dell'eseguibile finale.

È possibile trovare una spiegazione e ulteriori dettagli nella documentazione di boost. Ecco la versione di Linux: http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html

Da questa pagina:

maggior parte delle librerie Boost sono solo intestazioni: Sono costituiti interamente da file header contenenti i modelli e in linea funzioni, e non richiedono separatamente- binari della biblioteca compilati o trattamento speciale durante il collegamento.

...

Le uniche librerie Boost che devono essere costruiti separatamente sono:

  • Boost.Filesystem
  • Boost.GraphParallel
  • Boost.IOStreams
  • Boost.MPI
  • Boost.ProgramOptions
  • Boost.Python (vedi la Boost.Python costruire documentazione prima di costruire e l'installazione)
  • Boost.Regex
  • Boost.Serialization
  • Boost.Signals
  • Boost. sistema
  • Boost.Thread
  • Boost.Wave
+0

Puoi spiegarlo con maggiori dettagli per favore? Oppure condurmi a qualche risorsa? Sono abbastanza nuovo per lo sviluppo di Linux e non ne so molto. – tyrondis

+0

Aggiungo un link a una documentazione più precisa a riguardo. Fatto. – Klaim

1

Sembra che sia necessario collegare staticamente la libreria. Ecco una buona spiegazione.Boost static linking

+1

ok ma se li linko staticamente non perderò il vantaggio di avere dipendenze alle librerie condivise? Ho pensato che sarebbe il modo "standard" sotto linux – tyrondis

1

Ti sei collegato alla stessa versione della libreria boost_filesystem? A seconda di come si compila l'applicazione, è necessaria la presenza della stessa versione della libreria.

Si potrebbe provare a verificare la presenza di ciò che la vostra applicazione appare in realtà per con:

ldd <your app name> 

controllare probabilmente la variabile d'ambiente LD_LIBRARY_PATH pure.

+0

LLD mi ha dato \t libboost_filesystem.so.1.42.0 => non trovato \t libboost_program_options.so.1.42.0 => non trovato \t libboost_system.so.1.42. 0 => non trovato – tyrondis

1

Si può essere sicuri che /usr/lib/libboost_filesystem.so.1.42.0 non sia un collegamento morto?

7

Innanzitutto, provare a emettere ldconfig -p | grep libboost_filesystem.so in una console per assicurarsi che la libreria si trovi nella cache di ld.

Se non lo è, potrebbe essere necessario aggiungere un file con un nome simile boost.conf al /etc/ld.so.conf.d directory. Questo file dovrebbe contenere un percorso per le tue librerie di boost. Quindi eseguire sudo ldconfig per aggiornare la cache ld del sistema.

Spero che questo vi aiuterà ...

+1

thx, sembra un buon modo per farlo. Forse standard? – unludo

1

è/usr/lib nella variabile di ambiente LD_LIBRARY_PATH?

Problemi correlati