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");