想象一下,您有一个基于插件架构的应用程序,其中每个插件都是一个*.so
动态加载的文件dlopen()
。
主应用程序可以通过 引用符号dlsym()
,因此它可以调用插件的函数。插件如何调用主应用的函数?
我知道主应用程序可以提供一个充满函数指针的结构,插件可以使用它来调用应用程序。还有比这更简单的方法吗?
编辑:这是一个最小的工作示例来说明我的意思:
app.h
:
#ifndef APP_H
#define APP_H
void app_utility(void);
#endif
app.c
:
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include "app.h"
void app_utility(void)
{
printf("app_utility()\n");
}
int main(int argc, char **argv)
{
void *handle;
void (*plugin_function)(void);
if (argc < 2) {
fprintf(stderr, "usage: ./app plugin.so\n");
exit(1);
}
handle = dlopen(argv[1], RTLD_NOW | RTLD_LOCAL);
if (!handle) {
fprintf(stderr, "error loading plugin: %s\n", dlerror());
exit(1);
}
plugin_function = dlsym(handle, "doit");
if (!plugin_function) {
fprintf(stderr, "error loading symbol: %s\n", dlerror());
dlclose(handle);
exit(1);
}
plugin_function();
dlclose(handle);
return 0;
}
plugin.c
:
#include <stdio.h>
#include "app.h"
void doit(void)
{
printf("doit()\n");
app_utility();
printf("did it!\n");
}
示例用法:
$ gcc -o app app.c -ldl
$ gcc -shared -o plugin.so
$ ./app ./plugin.so
error loading plugin: ./plugin.so: undefined symbol: app_utility