2つの共有ライブラリ間の名前の競合をどのように処理しますか?

2つの共有ライブラリ間の名前の競合をどのように処理しますか?

私のLinux Mint 17.3システムでは、パッケージlibglfw2libglfw-dev.GLFW v3はリポジトリで利用できないため、ディレクティブを使用して手動でコンパイルすることを選択しました。ここ

オンラインで見つかったほとんどすべてのガイドラインには、GLFW v2に接続するにはを使用する必要があり、-lglfwGLFW v3の場合を使用する必要があることが示されています-lglfw3。ただし、これを行うと-lglfw3エラーが発生します。

/usr/bin/ld: cannot find -lglfw3

使用すると、次のような-lglfwエラーが発生します。

1.cpp:(.text+0x49): undefined reference to <function_name>

確かに、C_INCLUDE_PATHとLD_LIBRARY_PATHのすべてのパスは正しいです。ただし、GLFW v2パッケージをアンインストールしてインストールしてapt-get実行しましたが、問題なく動作しますldconfig-lglfwCMakeファイルのどこかに名前の競合を引き起こすバグがあるようです。

私の質問は:同じ名前の共有ライブラリを提供する2つのソースがあり、両方が必要な場合は、問題を解決するために(ビルド構成を詳しく調べる以外に)何ができますか?ファイル名を手動で確実に変更できますかso

答え1

たとえば、共有ライブラリと呼ばれlibfoo.so-x.y.zzマイナーな(完全に以前のバージョンと互換性のある)変更に対して成長し、y以前のバージョンとの互換性を維持するAPIを追加するために成長し、主なxAPIの変更(非互換)について変更を維持するのがアイデアです。実行可能プログラム(例:実行可能ファイルの出力の確認)は、プログラムが要求するライブラリとその依存関係を満たすために使用されるライブラリldd(1)()をキー番号()として知らせます。 「リンク」はビルド時に固定され、起動時に固定されます。したがって、プログラムを変更したり、引き続き機能させたり、同時にインストールしたりすることができます。libfoo.so.xlibfo.so.x.y.zlibfoo.so.xy.zyzlibfoo.so.3libfoo.so.4

ライブラリのディレクトリを見て、一連のシンボリックリンクを見ることができます。たとえば、リンカlibfoo.so -> libfoo.so.x -> libfoo.so.x.y.zとリンクすると、それに従い実行可能ファイルの依存関係として追加され、シンボルを検証するために使用されます。-lfoolibfoo.so.xlibfoo.so.x.y.z

libfooこのメカニズムは、従来のアプリケーションに以前のバージョンを提供しながら、コンパイル時に常に最新のバージョンを取得するように特別に設計されています。したがって、たとえば(および対応するlibbar.soシンボリックlibbar3.soリンクファーム)がバージョン2(-lbar番号なしの古いバージョンが2の場合)または3()用に-lbar3構築できる場合がよくあります。

建設機械しなければならないこの問題を解決することは可能ですが、非常にトリッキーです(すべての人が最新バージョン、最も輝くバージョン3が古いバージョン2と並んでいるという考えに熱狂するわけではありません)。

最善の方法は、ディストリビューションに依存してこれらの混乱を設定することです。

関連情報