Настройка
Предположим, я написал программу на C / C ++ и хотел разрешить загрузку плагина. Типичным решением было бы написать плагин как:
plugin. c
int my_plugin_fn() {
return 7;
}
и скомпилировать его, используя что-то вроде gcc -fpic -shared -o plugin.so plugin.c
Затем в основной программе, загружающей этот плагин, мы могли бы иметь:
загрузчик. c
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *plugin_handle = dlopen("./plugin.so", RTLD_LAZY);
if (!plugin_handle) {
printf("Could not open shared object: %s\n", dlerror());
return -1;
}
int (*fn)() = dlsym(plugin_handle, "my_plugin_fn");
char *err = dlerror();
if (err) {
printf("Could not resolve symbol: %s\n", err);
return -1;
}
printf("Plugin object returned: %d\n", fn());
return 0;
}
Я скомпилировал загрузчик. c с gcc -o loader loader.c -ldl
, и после его запуска результат был Plugin object returned: 7
, как и ожидалось.
Вопрос
Предположим, мы хотим добавить функции в нашу основную программу (загрузчик. c) которые могут использовать плагины. Например,
loader_v2. c
#include <stdio.h>
#include <dlfcn.h>
int times_2(int x) {
return 2*x;
}
int main() {
void *plugin_handle = dlopen("./plugin_v2.so", RTLD_LAZY);
if (!plugin_handle) {
printf("Could not open shared object: %s\n", dlerror());
return -1;
}
int (*fn)() = dlsym(plugin_handle, "my_plugin_fn");
char *err = dlerror();
if (err) {
printf("Could not resolve symbol: %s\n", err);
return -1;
}
printf("Plugin object returned: %d\n", fn());
return 0;
}
plugin_v2. c
extern int times_2(int);
int my_plugin_fn() {
return times_2(7);
}
Компиляция и запуск этих файлов таким же образом, как и раньше, дает Could not open shared object: ./loader_v2: symbol lookup error: ./plugin_v2.so: undefined symbol: times_2
.
Есть ли способ загрузить плагины, используя dlopen()
функции вызова из программы, которая их загрузила?