Я создаю стриженый объект и открываю его с помощью dlsysm (), но получаю следующую ошибку:
ошибка: неверное преобразование из «void *» в «void (*) ()»
Вот мой код:
#include<iostream>
#include<dlfcn.h>
using namespace std;
int main() {
void (*fnptr)();
void *handle;
handle = dlopen("./libtestshared.so",RTLD_LAZY);
if (!handle) {
cerr << "Cannot open library: " << dlerror() << '\n';
} else {
cout<<"Opening"<<'\n';
}
fnptr = dlsym(handle , "fun");
return 0;
}
Как dlsym
может возвращать указатель на функцию любой подписи, ее дизайнеры решили вернуть непрозрачный void*
, Конечно, dlsym
работает в предположении, что такой void*
затем можно безопасно преобразовать в правильный тип указателя функции. Это делается следующим образом:
auto fnptr = reinterpret_cast<void(*)()>(dlsym(handle , "fun"));
void *
несовместим с указателем на функцию.
В этом случае требуется приведение:
fnptr = (void (*)())dlsym(handle , "fun");
Я никогда не использовал dlsym, но вот что его страница руководства говорит:
Функция dlsym () берет «дескриптор» динамической библиотеки, возвращаемой функцией dlopen (), и имя символа с нулевым символом в конце, возвращая адрес, где этот символ загружен в память.
Так что он возвращает не указатель на функцию, а стандартный указатель! Должно работать что-то следующее:
void* returnedAddress = dlsym(handle , "fun");
fnptr = reinterpret_cast<void(*)()>(returnedAddress);