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


12

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

cannot open shared object libudev.so.0

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

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

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

回答:


12

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.