2010-02-18 7 views
5

Im usando Qmake per costruire una libreria condivisa su Ubuntu 9.10problemi ld di collegamento:/usr/bin/ld: non riesce a trovare [libraryname]

Questa libreria condivisa (A) ha una dipendenza su un'altra libreria condivisa (B) .

il progetto B è stato realizzato con successo.

nel file .pro per il progetto A, la mia variabile LIBS si presenta così:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0 

(ho usato il nome completo shlib perché le versioni della libreria sono diverse.)

In ogni caso, quando tento di costruire il progetto a, si rompe in fase di collegamento, e stampa il messaggio di errore:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0 
collect2: ld returned 1 exit status 
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1 
make ***[release] Error 2 
Exited with code 2 

dal messaggio di errore, ho pensato ld si lamentava che non poteva l ocate il file libdatelib, quindi l'ho copiato manualmente in/usr/lib/

tuttavia, questo non ha risolto il problema e ricevo lo stesso messaggio di errore.

Qualcuno sa come risolvere questo problema?

[Edit]

Sono abbastanza nuovo a palazzo utilizzando gcc. So come creare collegamenti simbolici, ma quali percorsi devo usare per il comando lnk ?. Il file a cui voglio collegarmi è in/home/username/work/cppdev/datelib/bin.

Anche il sistema di compilazione che uso (qmake), crea automaticamente i collegamenti simbolici come parte della costruzione, così ho già i seguenti file nella mia/home/nomeutente/lavoro/cppdev cartella/datelib/bin:

  • libdatelib_release.so (link MGS)
  • libdatelib_release.so.1 (link MGS)
  • libdatelib_release.so.1.0 (link MGS)
  • libdatelib_release.so.1.0.0 (lib comune)

Potrei dover fare un'altra domanda per spiegare perché ci sono così tanti collegamenti simbolici (qual è il punto?), E perché non posso collegarmi direttamente a una lib condivisa, ma devo passare attraverso un collegamento simbolico. Ho letto alcuni documenti online, ma quello che ho visto finora sembra più una dictum/tradizione piuttosto che ragioni tecniche reali PERCHÉ questo livello di astrazione è richiesto durante il collegamento su Linux.

+0

io non sono un esperto di costruzione e di collegamento sotto Linux e avuto spesso problemi simili ai tuoi. Tuttavia, ciò che faccio è raccomandare il seguente eccellente articolo su come trattare le librerie condivise su IBM DeveloperWorks: [** _ Dissecting librerie condivise - Scopri la tua libreria condivisa _ ** (di Peter Seebach)] [seebach]. La sezione _ "Modifica del percorso di ricerca del linker dinamico" _ potrebbe interessarti in particolare. [seebach]: http://www.ibm.com/developerworks/linux/library/l-shlibs.html – stakx

risposta

9

Non è possibile utilizzare -l in questo modo. -l posso trovare solo cose con nomi come libFOO.so, via -lFOO. È necessario un collegamento simbolico senza il numero di versione se si desidera specificarlo in questo modo nel build.

Qualcosa di simile:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so 

Ora -lthing funzionerà.

+0

Scusa, sono abbastanza nuovo su Linux. So come creare collegamenti simbolici, ma quali percorsi devo usare per il comando lnk ?. Il file a cui voglio collegarmi è in/home/username/work/cppdev/datelib/bin –

3

Il prefisso 'lib' viene aggiunto automaticamente al nome della libreria - uso:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0 
+0

Questo lavoro dosato per me ... –

0

Si può fornire il percorso completo. vale a dire

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0 

Comunque ti consiglierei di fare quello bmargulies suggerito: creare un link symolic e aggiungere -ldatelib_release

+0

Questo lavoro dosato per me ... –