web-dev-qa-db-fra.com

création et liaison d'une bibliothèque partagée

im essayant de construire une bibliothèque partagée sur une plate-forme cygwin windows en utilisant g ++, et plus tard le lier avec un autre fichier cpp: j'utilise les commandes suivantes:

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

lors de la liaison, l'erreur suivante apparaît:

/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 bibliothèque est très bien créée, mais je ne trouve que libbeat.so.1.0.1, pas libbeat.so ou libbeat.so.1 (ou ne sont-ils pas censés être là?)

l'une des autres questions suggère de créer un lien symbolique vers libbeat.so.1.0.1, mais cela n'a pas fonctionné non plus

15
jayant

Lors de l'utilisation de -l<libname> pour spécifier la bibliothèque à lier, l'éditeur de liens recherchera d'abord lib<libname>.so avant de rechercher lib<libname>.a.

Dans votre cas, cela ne fonctionne pas, car le nom de fichier de la bibliothèque n'est pas avec .so suffixe.

Vous pouvez créer simlink

libbeat.so -> libbeat.so.1.0.1

ou

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

Vous pouvez aussi utiliser -l:libbeat.so.1.0.1 (si votre éditeur de liens le prend en charge, archivez man ld description de -l paramètre). Une autre option consiste à spécifier la bibliothèque sans -l

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

Notez que la bibliothèque à laquelle vous liez doit être placée après le fichier objet/source en utilisant ses symboles - sinon l'éditeur de liens peut ne pas trouver les symboles.

18
Dmitry Yudakov