2011-02-09 10 views
1

char *function_name = "foo"を使用して、Cプログラムからfoo()を呼び出すことができます。 foo()ルーチンは共有ライブラリにあります。私はdlopenなどへのアクセス権がありません。通常の実行可能ファイルのロードステップです。この名前を解決して共有ライブラリからロードする方法はありますか?ライブラリ関数をその名前から呼び出すにはどうすればよいですか?

+1

ターゲットOSとは何ですか? – pascal

+0

パスカルが指摘しているように、この質問にはOSやOSファミリのタグが本当に必要です。 (おそらくPOSIX ..?) –

答えて

5

いいえdlopendlsymのどちらかを使用するか、独自の関数名と関数ポインタの配列を作成して、そのように調べます。

+1

'dlsym'は擬似ハンドル' RTLD_DEFAULT'を取るこ​​とができるので、 'dlopen'は必要ないかもしれません。 –

+0

確かに、私はそれを言及すべきでした。 '-rdynamic'を使ってリンクしていない限り、メインプログラムで定義されたシンボルは見つからないことに注意してください。 –

+0

私はこれが事実だと思ったが、確かにしなければならなかった。 –

2

関数名とロードアドレスにアクセスできる場合を除き、これを行うことはできません。 WindowsではLoadLibrary()GetProcAddress()を使用してこれを行うことができます。

あなたのケースでは、私はあなたが入手可能なもの(プラットフォーム、コンパイラなどは言及していません)、またはこれが実現可能かどうかを正確にはわかりません。しかし、そうではないと強く疑う。

0

関数を名前で呼び出す一般的な方法は、名前と関数ポインタのテーブルを使用することです。この手法の注意点は、関数がすべて同じシグニチャを持たなければならないことです。

名前の機能は分かっていますが、機能のシグネチャが異なる場合は、if-then-elseラダーを使用する必要があります。

+1

同じシグネチャを持つ必要はなく、同じ戻り値の型にする必要があります。 'rettype(*)()'を関数型(プロトタイプではなく)として使うことができます。そして、あなたはそれを呼び出すときに正しい引数型を渡す責任があります。あるいは、すべての関数ポインタ型が他の関数ポインタ型へのラウンドトリップキャストを生き延びることが保証されているので、それらを呼び出す前にall型に 'void(*)()'を使い、正しい型にキャストすることができます。 –

関連する問題