2012-05-25 10 views
13

im tratando de construir una biblioteca compartida en una plataforma Windows Cygwin usando g ++, y luego vincularlo con otro archivo CPP: i utilizar los siguientes comandos:edificio y la vinculación de una biblioteca compartida

// generate object file 

g++ -g -c -Wall -fPIC beat11.cpp -o beat11.o 

// to generate library from the object file 

g++ -shared -Wl,-soname,libbeat.so.1 -o libbeat.so.1.0.1 beat11.o -lc 

// to link it with another cpp file; -I option to refer to the library header file 

g++ -L. -lbeat -I . -o checkbeat checkbeat.cpp 

mientras se enlaza, el siguiente error surge:

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: 
    cannot find -llibbeat.so.1.0.1 

collect2: ld returned 1 exit status 

la biblioteca se crea muy bien, pero sólo puedo encontrar libbeat.so.1.0.1, no libbeat.so o libbeat.so.1 (o ¿no se supone que estar allí?)

una de las otras preguntas sugiere crear un enlace simbólico a libbeat.so.1.0.1, pero que aún no ha trabajo también

Respuesta

13

Cuando se utiliza para especificar -l<libname> biblioteca para vincular, el enlazador primero será buscar lib<libname>.so antes de buscar lib<libname>.a.

En su caso, no funciona, porque el nombre del archivo de la biblioteca no tiene el sufijo .so.

Es posible crear simlink

libbeat.so -> libbeat.so.1.0.1 

o

libbeat.so -> libbeat.so.1 
libbeat.so.1 -> libbeat.so.1.0.1 

También puede utilizar -l:libbeat.so.1.0.1 (si su enlazador lo soporta, el registro de entrada man ld descripción de -l parámetro). Otra opción es especificar la biblioteca sin -l

g++ -o checkbeat checkbeat.cpp -I . -L. libbeat.so.1.0.1 

Tenga en cuenta que la biblioteca se vincula a debe ser puesto después de archivo de objeto/fuente utilizando sus símbolos - de lo contrario el enlazador no puede encontrar los símbolos.

+0

Tuve el mismo problema y tu comentario con -l: nombre.búmano funcionó. Sin embargo, realmente no entiendo por qué no funciona con -L -lname como dijiste que el enlazador debería buscar lib .so también. también entendí que debería funcionar, pero al menos con cygwin no parece ser el caso. No lo he intentado con otros compiladores. – Devolus

+0

La respuesta aquí me ayudó: http://stackoverflow.com/questions/16154130/cygwin-g-linker-doesnt-find-shared-library – solstice333

Cuestiones relacionadas