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