19

g ++を使用してWindows cygwinプラットフォームで共有ライブラリを構築し、後で別のcppファイルとリンクしようとしています:私は次のコマンドを使用します:

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

リンク中に、次のエラーが発生します。

/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

ライブラリは問題なく作成されますが、libbeat.soまたはlibbeat.so.1ではなく、libbeat.so.1.0.1しか見つかりません(または、そこにあるはずはありませんか?)

他の質問の1つは、libbeat.so.1.0.1へのシンボリックリンクを作成することを提案していますが、それもうまくいきませんでした

4

1 に答える 1

22

-l<libname>リンクするライブラリを指定するためにを使用する場合、リンカはを検索するlib<libname>.so前に最初に検索しlib<libname>.aます。

.soあなたの場合、ライブラリのファイル名にサフィックスが付いていないため、機能しません。

simlinkを作成できます

libbeat.so -> libbeat.so.1.0.1

また

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

使用することもできます-l:libbeat.so.1.0.1(リンカーがサポートしている場合は、パラメーターman ldの説明を確認して-lください)。別のオプションは、なしでライブラリを指定することです-l

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

リンク先のライブラリは、そのシンボルを使用してオブジェクト/ソースファイルの後に配置する必要があることに注意してください。そうしないと、リンカがシンボルを検出できない場合があります。

于 2012-06-05T13:40:57.080 に答える