C ++プログラムでdlopen()関数を使用して共有ライブラリをロードしています。
次に、それが正常にロードされているかどうかを確認する方法は?または、そのライブラリに存在する関数のマングル名を使用して、ライブラリのロードを確認できますか?
C ++プログラムでdlopen()関数を使用して共有ライブラリをロードしています。
次に、それが正常にロードされているかどうかを確認する方法は?または、そのライブラリに存在する関数のマングル名を使用して、ライブラリのロードを確認できますか?
マニュアルページから:
dlopen()が何らかの理由で失敗した場合、NULLを返します。
関数は、 C ++識別子が宣言されていない限り、またはマングルされた名前を使用しdlsym
て宣言されていない限り、C++識別子を処理できませんextern "C"
。
正常にロードされなかった場合、dlopen()はNULLを返します。
dlopen()のマニュアルページには次のように書かれています。
戻り値
ファイルが見つからない、読み取るために開くことができない、dlopen()による処理に適切なオブジェクト形式でない場合、またはファイルのロードまたはそのシンボリック参照の再配置のプロセス中にエラーが発生した場合、dlopen()はNULLを返します。より詳細な診断情報は、dlerror()を介して入手できます。
ドキュメント ( http://linux.die.net/man/3/dlopen ) によると、dlopen は失敗すると NULL を返します。したがって、それを確認するだけで完了です。しかし、何らかの理由でそのライブラリが「良い」ライブラリであると確信できない場合は、システム用に独自の規則を定義できます。たとえば、システムによってロード可能なライブラリは、互換性のあるライブラリを作成したいユーザーに割り当てることができる「API キー」のようなものまで、いくつかの特定のプロパティを持つ特定の名前のシンボルを定義するように要求できます。
dlopen でエラーが発生すると、NULL が返され、dlerror は対応するエラー メッセージを返します。
誰もが言及したように、dlopen() が失敗すると null が返されますが、指定したパスにライブラリが存在するにもかかわらず、不思議な null が返される理由を解決しようとすると、その「特定のライブラリ」に依存します。そうしないと、呼び出しが NULL で失敗します ;)
.cpp ファイルの関数に extern "C" を使用して、コンパイラがそれを台無しにしないようにし、ライブラリがロードされたら呼び出すことができるようにします。