5

私はプレーンな X11 アプリに取り組んでいます。

デフォルトでは、私のアプリは libX11.so と標準の gcc C および数学ライブラリのみを必要とします。このアプリは、Xfixes、Xrender、および ALSA サウンド システムで機能を拡張できます。ただし、これら (Xfixes、Xrender、および ALSA) の機能はオプションです。

この動作を実現するために、ランタイム ローディングを使用しています。つまり、libXfixes、libXrender、および libasound を dlopen() する必要があります。

したがって、アプリはそのようなライブラリがなくても機能します。

今私の質問:

What library names should I use when calling dlopen()?  

これらはディストリビューションごとに異なることがわかりました。
たとえば、openSUSE 11 では、次のように名前が付けられます。

  • libXfixes.so
  • libXrender.so
  • libasound.so

ただし、Ubuntu では、次のように、名前にバージョン番号が付いています。

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

したがって、「libXfixes.so」を開こうとすると、Ubuntu では失敗しますが、lib は明らかにそこにあります。バージョン番号が添付されているだけです。では、私のアプリはこれをどのように処理すればよいでしょうか?
アプリで最初に /usr/lib/ を手動でスキャンして、どのライブラリがあるかを確認し、次に適切なものを選択する必要がありますか? または、誰かがより良いアイデアを持っていますか?

みんなありがとう、

アンディ

4

2 に答える 2

1

ライブラリの SONAME を使用して dlopen する必要があります。を使えばわかりますreadelf -d [libname]

たとえば、私の Fedora Linux マシンの 1 つで、C ライブラリの SONAME は libc.so.6 です。

.so 名から .so.6 名へのシンボリック リンクは保証されません。これらのシンボリック リンクは、ソフトウェアのコンパイルにのみ必要であり、通常、開発パッケージのないシステムにはインストールされません。

番号の変更は主要な API の違いを示しているため、別の番号のバージョンをロードすることは望ましくありません。

于 2010-05-13T14:16:46.757 に答える
-1

私が学んだことから、あなたはdlopen()(たとえば)「libXfixes.so」だけです。これは、とにかく、これと同様の方法で、最新のファイル「libXfixes.so.3」へのシンボリックリンクである可能性が最も高いです:

$ file /usr/lib/libalpm.so
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3'

私の「/usr/lib/」の簡単な概要は、そこにあるほぼすべてのライブラリが最新の「.X」番号付きファイルにシンボリックリンクされていることを示しており、他のディストリビューションでもそうされていると確信しています。

ライブラリの特定のバージョンが必要な場合にのみ、たとえば「libXfixes.so.2」などのバージョンに明示的に名前を付けます。

于 2010-05-13T13:40:43.743 に答える