2010-02-18 50 views
5

Im usando Qmake para construir una biblioteca compartida en Ubuntu 9.10problemas de vinculación LD:/usr/bin/ld: no puede encontrar [libraryname]

Esta biblioteca compartida (A) tiene una dependencia de otra biblioteca compartida (B) .

El proyecto B se ha creado con éxito.

en el archivo .pro para el proyecto A, mi variable de LIBS se parece a esto:

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

(que utiliza el nombre completo shlib porque las versiones de las bibliotecas son diferentes.)

En cualquier caso, cuando se intenta generar un proyecto, que se rompe en la etapa de vinculación, e imprime el mensaje de error:

/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 

Desde el mensaje de error, pensé ld se quejaba de que no podía l ocate el archivo libdatelib, así que lo copié manualmente en/usr/lib/

sin embargo, eso no resolvió el problema, y ​​recibo el mismo mensaje de error.

¿Alguien sabe cómo solucionar esto?

[Editar]

Soy bastante nuevo para la construcción de utilizar gcc. Sé cómo crear enlaces simbólicos, pero ¿qué caminos uso para el comando lnk ?. El archivo con el que quiero enlazar está en/home/username/work/cppdev/datelib/bin.

también el sistema de construcción que utilizo (qmake), crea automáticamente los enlaces simbólicos como parte de la construcción, por lo que ya tienen los siguientes archivos en mi/home/usuario/trabajo/cppdev carpeta/datelib/bin:

  • libdatelib_release.so (enlace sym)
  • libdatelib_release.so.1 (enlace sym)
  • libdatelib_release.so.1.0 (enlace sym)
  • libdatelib_release.so.1.0.0 (lib compartido)

Es posible que tenga que hacerme otra pregunta para explicar por qué hay tantos enlaces simbólicos (¿de qué sirve?), Y por qué no puedo simplemente vincular directamente a una biblioteca compartida, pero tengo que pasar por un enlace simbólico. He leído algunos documentos en línea, pero lo que he visto hasta ahora parece más una dicción/tradición en lugar de razones técnicas reales ¿POR QUÉ este nivel de abstracción es necesario al enlazar en Linux?

+0

no soy un experto en la construcción y la vinculación en Linux y, a menudo he tenido problemas similares a los suyos. Sin embargo, lo que sí puedo hacer es recomendar el siguiente excelente artículo sobre el tratamiento de bibliotecas compartidas en IBM DeveloperWorks: [** _ Disección de bibliotecas compartidas: conozca su biblioteca compartida _ ** (por Peter Seebach)] [seebach]. La sección _ "Modificar la ruta de búsqueda del vinculador dinámico" _ podría ser especialmente interesante para usted. [seebach]: http://www.ibm.com/developerworks/linux/library/l-shlibs.html – stakx

Respuesta

9

No puede usar -l de esa manera. -l solo puedo encontrar cosas con nombres como libFOO.so, a través de -lFOO. Necesita un enlace simbólico sin el número de versión si desea especificarlo así en la compilación.

Algo así como:

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

Ahora -lthing va a funcionar.

+0

Lo siento, soy bastante nuevo para construir en Linux. Sé cómo crear enlaces simbólicos, pero ¿qué caminos uso para el comando lnk ?. El archivo que quiero vincular está en/home/username/work/cppdev/datelib/bin –

3

El prefijo 'lib' se añade automáticamente al nombre de la biblioteca - utilización:

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

Este dosent trabajo para mí ... –

0

Usted puede proporcionar ruta completa. es decir,

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

Sin embargo, recomendaría usted para hacer lo que sugirió bmargulies: crear enlace symolic y añadir -ldatelib_release

+0

Este dosent trabajo para mí ... –

Cuestiones relacionadas