共有オブジェクトファイルを手動でリンク

共有オブジェクトファイルを手動でリンク

最近、大規模プロジェクトをコンパイルしてインストールしようとすると、組み込みYocto Linuxプロジェクトの依存関係地獄に閉じ込められました。依存関係をインストールすると(通常は構成/作成/作成インストールの段階で)、ライブラリーが見つかりませんエラーが頻繁に発生します。/usr/liborを少し見て、間違いなく/lib.soファイルがそこにあることがわかります。

たとえば、見つからないと文句を言う場合は、以下を見てlibfoo確認します。/usr/lib

$ ls /usr/lib/libfoo*  
libfoo.so.3    libfoo.so.3.5.2

リンカーが厳密に探していることがわかったlibfoo.soので、ソフトリンクを作成しました。

$ ln -s /usr/lib/libfoo.so.3.5.2 /usr/lib/libfoo.so

その後、突然リンカーはコンパイル中にそれを見つけて喜んでいます。

時にはなぜこれを行うべきですか?ソースから依存関係を手動でインストールする場合、これは通常のプロセスと見なされますか、それとも実行する必要があるいくつかの手順がありませんか?

私の結果は次のとおりですuname(有用な場合)。

$uname -a
Linux ventana 3.14.48-1.0.x-ga+yocto+gd9991ca #1 SMP Wed Apr 18 15:23:20 MST 2018 armv7l GNU/Linux

ベストアンサー1

一般的に言えば、プロジェクトが複数のメジャーバージョンを経ている場合、メジャーバージョンの.so変更は一般に互換性のないABIを反映するので、単独のバージョンを持つことは賢明ではありません。バージョン管理されたライブラリファイルのみがプログラムが「成功的に」リンクされるのを防ぎ、シンボリックリンクを更新すると、生成されたプログラムが不明な方法で失敗します。 (Windowsにも同様の問題があります。古いDLLはバージョン管理を使用しないことがよくあります。インストーラはしばしば互換性のないバージョンに置き換えます。、「DLL地獄」につながります。 )

README要件が何であるかを確認するために(またはそれに対応する)ファイルを確認し、実行してconfigure --help予想されるフォールバックをオーバーライドできることを確認します。これは、プログラムを正しいライブラリバージョンにバインドするのにも役立ちます。

おすすめ記事