私は、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へのシンボリックリンクを作成することを提案していますが、それでもうまくいきませんでした
-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
リンク先のライブラリは、シンボルを使用してオブジェクト/ソースファイルの後に配置する必要があります。そうしないと、リンカがシンボルを見つけられない場合があります。