1

実行時にdlopenを使用してダイナミックライブラリをロードするために必要なC++アプリケーションを開発しています。このライブラリは通常、私が作成するものではありません。

このライブラリと私のアプリケーションの間の将来のバイナリ互換性を確保するために、人々はどのような方法をお勧めしますか?

私が見ているオプションは次のとおりです。

  1. ライブラリファイル名にバージョン番号を入力し、何があっても(シンボリックリンクを介して)ロードを試みます。dlopenが失敗した場合は、エラーを報告してください。

  2. バージョン番号を返す2番目のインターフェースを維持します。ただし、このインターフェイスが何らかの理由で変更された場合、以前と同じ問題が発生します。

他に選択肢はありますか?

4

3 に答える 3

3

動的にロードされる(つまりdlopen-ed)ライブラリに関する規則を定義する必要があります。

APIのバージョンなどを示すシンボルを提供するためにライブラリが必要であるという慣習があるかもしれませんconst char mylib_version_str[];。もちろん、これを支援する独自のプリプロセッサトリックを使用することもできます。

インスピレーションを得るために、GCCがプラグインに必要なもの(plugin_is_GPL_compatibleシンボルなど)を確認できます。

動的にロードされるライブラリがC++の場合は、デマングリングを使用して関数のシグネチャをチェックできます。

于 2012-12-03T14:07:29.803 に答える
1

両方のオプションを使用してみませんか?ちなみに、すでにいくつかのライブラリがそれを行っています(たとえば、古いdllはLua51.dllであり、Lua52などがあります。そのバージョンを照会することもできます)。

優れたインターフェースは変更される可能性がありますが、それほど頻繁ではありません。なぜ2つの単純な静的メソッドが必要なのですか。

const char* getLibraryName();
uint32 getLibraryVersion();

残業を変更しますか?

于 2012-12-03T14:08:25.487 に答える
1

あなた/彼らがライブラリ/アプリケーションを構築するためにlibtoolを使用している場合は、次の方法をお勧めします:http ://www.gnu.org/software/libtool/manual/libtool.html#Versioning

于 2012-12-03T14:45:00.970 に答える