0

私は次の問題を抱えています。parser.o ライブラリにテキスト パーサーがあります。いくつかのテキストを解析して(関数を検索)、それらを呼び出したいと思います。関数は functions.o ファイルに実装されています。テキストを解析できますが、ライブラリ functions.o から関数を呼び出す方法がわかりません。メインプログラムへの参照を取得するために使用dlopen(NULL, RTLD_NOW);していますが、実際のプログラムを実行すると、指定された関数が見つからず、エラー"./program: undefined symbol: function_name"が表示されます (function_name は functions.o にあります) :/. functions.odlopen(functions.o,...)は動的にリンクされたライブラリではないため、リンクできません。私はプログラムをコンパイルしています:

   `gcc main.c lib/*`

何か助けはありますか?:)

4

2 に答える 2

1

プログラムを静的にリンクする必要があり、すべての関数が署名を共有している場合は、関数ポインターの独自のテーブルを定義できます。

struct entry
{
  const char * const func_name;
  void (*func) (void);
};

static struct entry table[] = 
{
  {"func_A", func_A},
  {"func_B", func_B},
  ...
};

入力から関数の名前を検索し、ポインターを介して呼び出します。関数シグネチャが異なる場合でも、関数呼び出しをラップするサンクを使用してこれを実現できます。

void func_A_thunk(void* dummy, ...)
{
  // parse the var_args to match the signature for func_A
  func_A (arg1, arg2, arg3);
}

以上のことをすべて述べました...これは非常に面倒なので、可能であればライブラリコードを動的にリンクされたライブラリにコンパイルし、dlopen適切に使用してください。

于 2012-12-03T17:48:53.433 に答える
0

dlopen(NULL, RTLD_NOW);

dlopenandを実行する代わりにdlsym、関数を直接呼び出すだけです。すべてをメインの実行可能ファイルにリンクするため、使用する理由はまったくdlopenありません。

于 2012-12-21T06:18:34.487 に答える