2012-05-25 4 views
13

im cercando di costruire una libreria condivisa su una piattaforma Windows cygwin utilizzando g ++, e poi collegarlo con un altro file cpp: io uso i seguenti comandi:costruzione e il collegamento di una libreria condivisa

// 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 

durante il collegamento, il seguente errore affiora:

/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 libreria viene creato più che bene, ma posso trovare soltanto libbeat.so.1.0.1, non libbeat.so o libbeat.so.1 (o stanno non dovrebbe ci sono?)

una delle altre questioni suggerisce di creare un link simbolico a libbeat.so.1.0.1, ma che il lavoro non ha ancora troppo

risposta

13

Quando si utilizza -l<libname> per specificare biblioteca per collegare, il linker prima cercare lib<libname>.so prima di cercare lib<libname>.a.

Nel tuo caso non funziona, perché il nome file della libreria non è con il suffisso .so.

È possibile creare simlink

libbeat.so -> libbeat.so.1.0.1 

o

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

È inoltre possibile utilizzare -l:libbeat.so.1.0.1 (se il linker lo supporta, il check-in man ld descrizione del -l parametri). Un'altra opzione è quella di specificare la libreria senza -l

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

Nota che la biblioteca si collega a dovrebbe essere messo dopo il file oggetto/origine utilizzando i suoi simboli - in caso contrario il linker non può trovare i simboli.

+0

Ho avuto lo stesso problema e il tuo commento usando -l: libname.so ha funzionato. Tuttavia, non capisco perché non funzioni con -L -lname come hai detto che il linker dovrebbe cercare lib .so pure. era anche mia comprensione che avrebbe dovuto funzionare, ma almeno con cygwin non sembra essere il caso. Non ho provato con altri compilatori. – Devolus

+0

La risposta qui mi ha aiutato: http://stackoverflow.com/questions/16154130/cygwin-g-linker-doesnt-find-shared-library – solstice333