web-dev-qa-db-ja.com

/ usr / local / libのライブラリが見つかりません

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

開発にEclipseを使用しています。このライブラリを使用するには、ライブラリへのインクルードパス(この場合はusr/local/include/ohNet)を設定し、リンカー検索パス(-L)(/usr/local/lib/ohNet)と特定のライブラリ(-l)を設定する必要があります(この場合、このフォルダー内でisである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にインストールされるのは問題だと言っているいくつかの投稿を見つけました こちらを参照 ... Eclipseがこのパスのライブラリを認識するようにするldの追加設定これに対する解決策は何ですか?

よろしく

27
Moonlit

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

 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機能を使用)または絶対パス(たとえば、/ optでインストールする場合)と共にライブラリを出荷する場合に役立ちます。次に、実行時にこれらのバンドルされたライブラリを見つけるために使用されます。

59
Nikos C.