40

ohNetというフレームワークを使用してアプリケーションを構築しています。フレームワークを構築した後、 経由でフレームワークをインストールする可能性がありmake installます。デフォルトでは、ライブラリは/usr/local/[lib|include]フォルダー内にインストールされます。わかった。

私は開発にEclipseを使用しています。このライブラリを使用するには、ライブラリへのインクルード パス (この場合はusr/local/include/ohNet) を設定し、リンカー検索パス (-L)( /usr/local/lib/ohNet) と特定のライブラリ (-l) を設定する必要があります (この場合はlibohNet.so、 Eclipse でプロジェクトをビルドすると正常に動作します、プログラムを実行しようとすると、次のメッセージが表示されます。

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory

これを再確認したところ、ファイルlibohNet.soはこのディレクトリにあります! このファイルが見つからない理由は何ですか?

Google で検索したところ、ここ/usr/local/libではなくライブラリがインストールされていることに問題があるという投稿がいくつか見つかりました...このパスのライブラリを認識させるために、いくつかの追加設定を構成する必要がありますか? これに対する解決策は何ですか?/usr/lib eclipseld

よろしく

4

1 に答える 1

82

これはランタイム エラーであり、ビルド エラーではありません。フラグを設定-Lしても、実行時リンカーには何も起こりません。実行する必要があるのは、ランタイム ローダーにライブラリの /usr/local/lib も参照するように指示することです。これには 2 つの方法があります。LD_LIBRARY_PATH1 つ目は、環境変数へのパスを追加することです。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"

2 つ目は、実行時リンカーの構成ファイルを更新することです。これは、/etc/ld.so.conf ファイルに次の行を追加することで発生します。

/usr/local/lib

そのファイルのどこかに、または新しいパスを含む /etc/ld.so.conf.d/ ディレクトリに新しい *.conf ファイルを作成することによって。例えば:

/etc/ld.so.conf.d/99local.conf

だけで:

/usr/local/lib

初期化。これは、カスタム ライブラリ パスをシステムによって設定されたパスとは別に保持できるため、これを行うための推奨される方法です。(「99」プレフィックスは、同じライブラリを含む可能性のあるシステム パスを横取りしないように、ファイルがそこにある他のファイルと比較して最後に読み込まれるようにするためにあります。)

/etc 内のファイルを変更/作成したら、次を実行する必要があります。

ldconfig

変更を有効にするためのルートとして。(このコマンドは、実行時リンカーが実際に使用するファイルである /etc/ld.so.cache ファイルを更新します。)

バイナリが実行時に必要なライブラリを見つける別の方法もあります。実際には、ライブラリ パスを実行可能ファイル自体にハードコーディングできます。これは、いわゆる「rpath」を設定することによって実現されます。これはリンカー オプションであり、gcc (または g++) からリンカーに渡す必要があるため、この-Wlオプションを使用する必要があります。リンカ オプションは-rpath=PATH. したがって、これをリンク フラグに追加する必要があります。

-Wl,-rpath=/usr/local/lib

ただし、これはお勧めしません。rpath は、ライブラリを実行可能ファイル (おそらくインストーラーと一緒に) と一緒に配布する場合に便利です。相対 rpath (このrpath $ORIGIN機能を使用する場合) または絶対 rpath (たとえば、/opt にインストールする場合) を使用して検索します。実行時にこれらのバンドルされたライブラリ。

于 2013-07-26T23:58:48.020 に答える