0

我有以下问题。我有位于 parser.o 库中的文本解析器。我想解析一些文本(查找函数)并调用它们。函数在functions.o 文件中实现。我能够解析文本,但我不知道如何从库 functions.o 中调用函数。我dlopen(NULL, RTLD_NOW);用来获取对主程序的引用,但是当我运行实际程序时,它找不到给定的函数并"./program: undefined symbol: function_name"出现错误(函数名位于函数.o):/。我无法链接functions.o,dlopen(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},
  ...
};

然后从输入中查找函数的名称并通过指针调用它。如果函数签名不同,您仍然可以使用包装函数调用的 thunk 来完成此操作。

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 回答