2012-11-12 6 views
5

Sto provando a costruire una piccola applicazione QI (C++) su Linux ma non riesce a costruire con numerosi errori del linker, lamentando le dipendenze mancanti per la libreria Qt con cui sto collegandomi. Ho usato ldd sulle librerie Qt per verificare che le librerie ci siano davvero - e lo sono.Come collegarsi automaticamente alle dipendenze della libreria condivisa

Il mio problema sembra essere correlato alla discussione in questa discussione: Linking dependencies of a shared library E mentre quel filo mi ha aiutato a identificare il mio problema preciso, sembra che la conclusione di quel filo era che la mia domanda dovrebbe collegare!

L'applicazione viene compilata con il seguente comando:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread 

L'esecuzione di questo genera avvertimenti del seguente modulo, e il collegamento alla fine non riesce con errori di riferimento non definiti (a simboli definiti nelle librerie 'mancanti'):

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 

e così via (in totale ci sono 18 dipendenze, che non è stata trovata.)

posso ottenere questo per compilare se io vai e aggiungi esplicitamente -lglib, -lpng14, -lz -lfreetype e così via, ma come ho detto ci sono 18 dipendenze - e preferirei non farlo. Sembra anche che non dovrei farlo.

Ho compilato lo stesso progetto sul mio computer portatile che utilizza lo stesso identico Linux Distro (openSuse 12.2) senza problemi. Tutte le librerie, inclusa Qt, sono state installate dai repository di distro.

Penso che questa potrebbe essere una sorta di problema di installazione sulla mia installazione di openSUSE, ma non ho idea di dove iniziare a cercare di risolvere questo problema.

Cheers, Craig

+0

Sono d'accordo che dovrebbe funzionare senza dover aggiungere tutte le librerie dipendenti. Sospetto una errata configurazione del sistema di qualche tipo. Forse reinstallare pezzi della toolchain, come il compilatore e le binutils, potrebbe aiutare ...? –

+0

Uso di Yast Ho rimosso i binutils, quindi ho reinstallato gli strumenti di gcc e ora funziona. Grazie per la tua risposta. –

risposta

1

Sembra che /usr/lib64/libQtGui.so hanno hardcoded rpaths a loro di localizzare le librerie condivise dipendenti. Su uno dei tuoi host le librerie necessarie sono nella posizione prevista mentre sull'altro host non lo sono.

È possibile utilizzare qualcosa come elfdump per ottenere il dalla libreria condivisa QT per scoprire dove apparirà. Quindi è possibile utilizzare (credo) -R sulla riga di comando del collegamento per puntare a dove le librerie sono effettivamente installate su quell'host.

EDIT: Penso che si possa fare qualcosa di simile objdump -x <binary/library> | grep -i rpath

+0

Seguendo i suggerimenti di Jamey sopra cose fisse per me, ma solo come follow-up sulla tua risposta. openSuse non viene fornito con elfdump. Qualche idea su come troverei RPATH incorporato in un file elf su questo sistema. Ho provato objdump e readelf, e ho trovato riferimenti alle librerie nel loro output, ma nulla su un RPATH. –

+0

Io uso 'chrpath' per quello. In Debian, è nel pacchetto 'chrpath', non sorprendentemente. :-) Immagino che anche 'objdump' possa funzionare, ma se non ci sono rpath nel binario, semplicemente non vedrai alcun output, quindi è difficile dire se sta funzionando senza trovare un binario con ingombro di caratteri da testare. –