web-dev-qa-db-ja.com

ldが共有ライブラリを見つけられません

注:私は多くのトピックに質問similarを訪問しましたが、受け入れられたものとして選択されたソリューションはすべて私が試したものでしたすでに試した =なので、重複としてマークする前にこれを考慮してください。

また、私は一般的にLinuxを初めて使用するので、根本的に間違っていることを言った場合は、遠慮なく訂正してください。

問題:

私はc ++ 共有ライブラリを作成して使用しようとしていますが、「作成」の部分は完了しているようですが、それに対してリンクしようとすると、ldはそれを表示できませんです。

これは私がすでに何とかしてきたことです:

  1. すべての.cppファイルを-fPICで明示的にコンパイルしました
  2. ライブラリを作成しました

    g ++ -shared -fPIC -Wl、-soname、libcustom_program_options.so.1 -o libcustom_program_options.so.1.0.1 * .o

  3. Ldconfigを実行して、次のようにローダーキャッシュを更新します。

    Sudo ldconfig -n/usr/local/lib

ライブラリをテストプログラムにリンクしようとすると、次のようになります。

g++ main.cpp -o main -L /usr/local/lib -l libcustom_program_options

ここで何が起こるかです:

/ usr/bin/ld:-llibcustom_program_optionsが見つかりません

collect2:エラー:ldが1つの終了ステータスを返しました


注:ldがライブラリのfull-nameまたはsonameを探しているのか、あるいは多分"lib-と.soの間の名前を探しているのかどうかわかりませんでした。{ version} "なので、それぞれを試しました。どちらも助けにはならなかった。

1
TuRtoise

はい、ようやく解決しました。

リンカが実際に検出することを期待しているファイルを確認したら、次に何をすべきかがわかりました。

私は電話でそれをしました:

ld -L/usr/local/lib -lcustom_program_options --verbose

ここで、/ usr/local/libは、ライブラリを配置したディレクトリで、custom_program_optionsは、lib-プレフィックスとすべてのプレフィックス(つまり拡張子)を取り除いたライブラリの名前ですおよびバージョン)。

考えられるすべてのディレクトリのリストと正確に予想されるファイル名を出力したため、ldconfig(OPで説明)を呼び出している間にlibcustom_program_options.soを探していることがわかりました- libcustom_program_options.so.1およびlibcustom_program_options.so.1.0.1(バージョン番号に注意)。

Ldが実際に存在しないことを見つけようとしていたファイル。

解決策は、リンクを手動で作成することでした:

Sudo ln -s /usr/local/lib/libcustom_program_options.so.1 /usr/local/lib/libcustom_program_options.so

これでかなり解決しました。犯人は、リンカーが求めている正確なファイル名が何であるかを知らなかった。

1
TuRtoise