web-dev-qa-db-ja.com

「共有オブジェクトを開けません」エラーを克服するためにライブラリをシンボリックリンクしても大丈夫ですか(そうでないか)?

何らかの理由で、プログラムがすべての依存関係を正しく指定または含めていない場合があり、プログラムを起動すると依存関係がないことを示すエラーが発生することがあります。典型的なエラーは次のようなものです:

cannot open shared object libudev.so.0

/usr/libまたは他のシステムの場所にシンボリックリンクを作成することで、このような問題を回避するようにアドバイスする多くの回答がありますが、これは問題を解決することが多いようです。しかし、私はそれが悪い考えだと人々に忠告するコメントの数を見る。 代表的な回答を1つ示します

ライブラリをシンボリックリンクしてプログラムを機能させることは、どのような状況で許容されますか?決して?時々?プログラムの実行を終了した後にシンボリックリンクを削除するとどうなりますか?

これを行うとどうなりますか?

12
John Feminella

これらのリンクの作成に関する問題は、それらが意味のある方法で管理されていないことです。そのライブラリが削除されると、リンクが壊れます。ライブラリがアップグレードされると、そこにあるとは思わないリンクが原因でエラーが発生する場合があります。

また、あなたは本質的にシステムに嘘をついています。リンクされた例では、libudev.so.1が実際にlibudev.so.0であるふりをしています。それらは、理由により異なった名前が付けられています(ライブラリの異なるバージョン)。これは一部のプログラムでは正常に機能しますが、バージョン間の違いが問題(セグメンテーション違反やその他の予期しない動作など)を引き起こす可能性があります。

したがって、プログラムを実行するためだけにこのリンクを作成し、後で削除することがわかっている場合は、2番目の問題ではなく最初の問題に対処します。これは主要な問題に対処しますが、理想的ではありません。

理想的な解決策は、当然ながら、適切なバージョンのライブラリ(リンクされた例で受け入れられている回答)をインストールするか、使用しているバージョンに対してプログラムをコンパイルすることです。

12
Nattgew