452

プログラムは、Linux PC から Linux+Xenomai ARM ツールチェーンにクロスコンパイルされた Xenomai テスト スイートの一部です。

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

編集: OK、末尾の .1 がファイル名の一部であることに気付きませんでした。とにかくそれはどういう意味ですか?

4

21 に答える 21

440

あなたのライブラリは動的ライブラリです。実行時にオペレーティング システムがどこにあるのかをオペレーティング システムに伝える必要があります。

そのためには、次の簡単な手順を実行する必要があります。

  1. わからない場合は、ライブラリが配置されている場所を見つけてください。
sudo find / -name the_name_of_the_file.so
  1. 動的ライブラリ パス環境変数の存在を確認します( LD_LIBRARY_PATH)
$ echo $LD_LIBRARY_PATH

        表示するものが何もない場合は、デフォルトのパス値を追加します (必要に応じて追加しません)。

$ LD_LIBRARY_PATH=/usr/local/lib
  1. 目的のパスを追加してエクスポートし、アプリケーションを試します。

パスは、があるディレクトリにする必要があることに注意してくださいpath.so.something。その中にある場合path.so.somethingは、次の/my_library/path.so.somethingようになります。

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

ソースへの参照

于 2014-01-16T22:07:14.560 に答える
207

試すことができるいくつかの解決策を次に示します。

ldconfig

AbiusX が指摘したように: ライブラリをインストールしたばかりの場合は、単にldconfigを実行する必要があるかもしれません。

sudo ldconfig

ldconfig は、コマンド ラインで指定されたディレクトリ、ファイル /etc/ld.so.conf、および信頼できるディレクトリ (/lib および /usr/lib) で見つかった最新の共有ライブラリへの必要なリンクとキャッシュを作成します。

通常、新しいライブラリをインストールするときにパッケージ マネージャーがこれを処理しますが、常にではありません。それが問題でなくても、ldconfig を実行しても問題はありません。

開発パッケージまたは間違ったバージョン

それがうまくいかない場合は、Paul の提案もチェックして、ライブラリの「-dev」バージョンを探します。多くのライブラリは、開発パッケージと非開発パッケージに分割されています。次のコマンドを使用して検索できます。

apt-cache search <libraryname>

これは、間違ったバージョンのライブラリがインストールされている場合にも役立ちます。一部のライブラリは、Python など、異なるバージョンで同時に公開されています。

図書館の場所

適切なパッケージがインストールされていることが確実であり、ldconfig がそれを見つけられなかった場合は、非標準のディレクトリにある可能性があります。デフォルトでは、ldconfig は/lib、 、およびおよび/usr/libにリストされているディレクトリを検索します。ライブラリが別の場所にある場合は、ディレクトリを の独自の行に追加するか、ライブラリのパスを に追加するか、ライブラリを に移動します。次に実行します。/etc/ld.so.conf$LD_LIBRARY_PATH/etc/ld.so.conf$LD_LIBRARY_PATH/usr/libldconfig

ライブラリがどこにあるかを調べるには、これを試してください:

sudo find / -iname *libraryname*.so*

libraryname(ライブラリの名前に置き換えます)

ルートに行く場合は、ログインするたびに実行されるように、それをファイル$LD_LIBRARY_PATHに入れたいと思うでしょう:~/.bashrc

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library
于 2015-02-11T17:11:07.427 に答える
148

更新以下に書いていることは、共有ライブラリに関する一般的な回答として真実ですが、この種のメッセージの最も頻繁な原因は、パッケージをインストールしたが、そのパッケージのバージョンを
インストールしていないためだと思います。-dev


まあ、それは嘘ではありません-libpthread_rt.so.1そのリストにはありません. おそらく、あなたが持っているライブラリに依存するように再構成して再構築するか、提供するものをインストールする必要がありますlibpthread_rt.so.1

一般に、.so の後の数字はバージョン番号であり、それらが互いにシンボリック リンクになっていることがよくあるため、バージョン 1.1 の libfoo.so を使用している場合、実際のファイルは libfoo.so.1.0 になります。 libfoo.so.1.0を指すシンボリックリンクfoo.soとfoo.so.1。また、バージョン 1.1 を他のバージョンを削除せずにインストールすると、libfoo.so.1.1 が作成され、libfoo.so.1 と libfoo.so が新しいバージョンを指すようになりますが、その正確なバージョンを必要とするコードは、 libfoo.so.1.0 ファイルを使用します。バージョン 1 API のみに依存しているが、1.0 か 1.1 かを気にしないコードは、libfoo.so.1 を指定します。oripがコメントで指摘したように、これはhere でよく説明されています。

あなたの場合、へのシンボリックリンクでうまくいくかもしれません。ただし、コードが壊れたり、テレビの夕食を食べたりしないという保証はありません.libpthread_rt.so.1libpthread_rt.so

于 2009-01-26T18:11:59.323 に答える
27

LD_LIBRARY_PATH検索パスを示す を~/.bashrcファイルに追加してみてください

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

できます!

于 2014-07-07T13:21:29.387 に答える
13

linux.orgのリファレンス ページでは仕組みについて説明していますが、その背後にある動機については何も説明していません :-(

そのためには、Sun Linker and Libraries Guideを参照してください。

さらに、シンボルのバージョン管理 (GNU 拡張機能) を使用すると、同じ関数の互換性のない複数のバージョンを単一のライブラリに存在させることができるため、「外部バージョン管理」は Linux ではほとんど廃止されていることに注意してください。この拡張により、glibc は同じ外部バージョン (libc.so.6過去 10 年間) を持つことができました。

于 2009-01-27T06:01:39.610 に答える
2

私がしなければならなかったのは、実行することだけでした:

sudo apt-get install libfontconfig1

私はにあるフォルダーにいて、/usr/lib/x86_64-linux-gnu完全に機能しました。

于 2015-03-16T13:56:39.940 に答える
2

Microsoft Windows でアプリケーションを実行している場合、動的ライブラリ ( ) へのパスを環境変数.dllで定義する必要があります。PATH

UNIX でアプリケーションを実行している場合、動的ライブラリ ( ) へのパスを環境変数.soで定義する必要があります。LD_LIBRARY_PATH

于 2016-02-27T12:33:35.910 に答える
2

ライブラリが非標準パスにある場合は、パスにldconfig続いて実行してください。

たとえば、次のように実行する必要がありました。

sudo ldconfig /opt/intel/oneapi/mkl/2021.2.0/lib/intel64

R をインテル® MKL に対してコンパイルする

于 2021-06-21T15:51:01.430 に答える
1

Ubuntu 18.04 を使用しています

-dev対応するパッケージをインストールするとうまくいきました。

sudo apt install libgconf2-dev

上記のパッケージをインストールする前に、次のエラーが発生しました。

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
于 2020-06-02T17:06:48.873 に答える
0

ここでライブラリについて読むことができます: https://domiyanyue.medium.com/c-development-tutorial-4-static-and-dynamic-libraries-7b537656163e

于 2022-01-30T15:21:38.183 に答える