web-dev-qa-db-ja.com

共有ライブラリの構築とリンク

私は、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へのシンボリックリンクを作成することを提案していますが、それでもうまくいきませんでした

15
jayant

-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

リンク先のライブラリは、シンボルを使用してオブジェクト/ソースファイルの後に配置する必要があります。そうしないと、リンカがシンボルを見つけられない場合があります。

18
Dmitry Yudakov