Предположим, у меня есть следующее:
// lib1.h
struct S
{
int x;
};
void f(S* s); // defined in .cpp
и
// lib2.h
struct S
{
int x;
int y;
};
void f(S* s); // defined in .cpp
В результате lib1.so
и lib2.so
.
Итак, мой вопрос:
#include <dlfcn.h>
int main()
{
const auto lib_to_use = <some application level logic, resulting in lib1.so or lib2.so>;
const auto lib = dlopen(lib_to_use, RTLD_LAZY);
assert(lib);
const auto func = dlsym(lib, "f");
assert(func);
// how do I call `func`, given the fact it takes different, library-specific type `S`?
dlclose(lib);
}
Моя реальная проблема - как мне загрузить во время выполнения libfuse2
или libfuse3
и выполнить fuse_main_real
, учитывая тот факт, что этоимеет параметр fuse_operations*
, то есть struct
с указателями на функции, но с разными типами для двух версий?
Edit : я не верю, что это нарушает одно определениеправило - только один из них будет связан одновременно, но никогда не оба.(Я также не уверен, что ODR не работает, если оба загружены, так как они используются вручную, но это другая тема)