GNU/Linux >> Linux の 問題 >  >> Linux

g++ を使用した動的共有ライブラリのコンパイル

dlsym シンボルへのポインタを返します。 (void*として あなたの場合、関数ポインタにキャストする必要があります.

 double (*mycosine)(double); // declare function pointer
 mycosine = (double (*)(double)) dlsym(handle, "cos"); // cast to function pointer and assign

 double one = mycosine(0.0); // cos(0)

したがって、これは、コンパイラ エラーが良い手がかりとなるまれなケースの 1 つです。;)


C は void * からの暗黙のキャストを許可します 任意のポインター型 (関数ポインターを含む)。 C++ では、明示的なキャストが必要です。 leiflundgren が言うように、 dlsym() の戻り値をキャストする必要があります 必要な関数ポインタ型に。

多くの人は、C の関数ポインターの構文が扱いにくいと感じています。一般的なパターンの 1 つは、関数ポインターを typedef することです:

typedef double (*cosine_func_ptr)(double);

関数ポインタ変数 cosine を定義できます あなたのタイプのメンバーとして:

cosine_func_ptr cosine;

そして、厄介な関数ポインター構文の代わりに型を使用してキャストします:

cosine = (cosine_func_ptr)dlsym(handle, "cos");

Linux
  1. Linux –ライブラリ関数への呼び出しのシステム全体の監視?

  2. Linux 上の C++ 動的共有ライブラリ

  3. gcc の共有ライブラリ関数のスタティック リンク

  1. Linux で共有ライブラリを初期化する方法

  2. Linux で共有ライブラリのバージョン管理を行う方法は?

  3. 共有ライブラリ (.so) は、ローディング プログラムに実装されている関数をどのように呼び出すことができますか?

  1. Linux 共有ライブラリの紹介 (共有ライブラリの作成方法)

  2. 静的ライブラリを共有ライブラリに変換しますか?

  3. 共有ライブラリの読み込みエラー (glew)