我正在用 C 语言编写一个程序,它允许用户实现自定义“函数”以由某种解释器运行。我还希望允许用户用纯 C 编写这些自定义函数,然后动态加载。为此,我创建了两个结构,一个用于解释函数,一个用于 native 函数。
这是一个简化的例子:
struct func_lang {
bool is_native;
char* identifier;
// various other properties
}
typedef void (*func_native_ptr)(int);
struct func_native {
bool is_native;
char* identifier;
func_native_ptr func_ptr;
}
然后我使用每个结构的 identifier
属性将它们放入哈希表中,然后我可以使用它在运行时执行它们。
我的问题实际上来自另一端,加载的库。我希望能够允许加载的库“发布”他们想要插入到列表中的函数。例如,也许有这样的功能:
void register_func_native(char* identifer, func_native_ptr func_ptr);
然后,当我从库中调用 init
函数时,他们可以调用此函数将函数插入哈希表。
这行得通吗?我对如何链接 register_func_native
函数有点困惑,因为加载的库需要它,但必须由加载程序本身定义。我的加载程序函数是否需要在另一个共享库中实现,然后可以在运行时链接?
最佳答案
这将取决于平台,但在 Linux 和我见过的所有 Unix 上,它都可以工作。示例:
$ cat dll.c
void print(char const *);
void foo()
{
print("Hello!");
}
$ gcc -Wall -shared -fPIC -o dll.so dll.c
$ cat main.c
#include <dlfcn.h>
#include <stdio.h>
void print(char const *msg)
{
puts(msg);
}
int main()
{
void *lib = dlopen("./dll.so", RTLD_NOW);
void (*foo)() = (void (*)())dlsym(lib, "foo");
foo();
return 0;
}
$ cc -fPIC -rdynamic main.c -ldl
$ ./a.out
Hello!
关于c - 允许C动态加载库到 "publish"函数使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346934/