ошибка: неверное преобразование из `void *` в `void (*) ()` в случае dlsysm

Я создаю стриженый объект и открываю его с помощью 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;
}

2

Решение

Как dlsym может возвращать указатель на функцию любой подписи, ее дизайнеры решили вернуть непрозрачный void*, Конечно, dlsym работает в предположении, что такой void* затем можно безопасно преобразовать в правильный тип указателя функции. Это делается следующим образом:

auto fnptr = reinterpret_cast<void(*)()>(dlsym(handle , "fun"));
4

Другие решения

void * несовместим с указателем на функцию.

В этом случае требуется приведение:

fnptr = (void (*)())dlsym(handle , "fun");
2

Я никогда не использовал dlsym, но вот что его страница руководства говорит:

Функция dlsym () берет «дескриптор» динамической библиотеки, возвращаемой функцией dlopen (), и имя символа с нулевым символом в конце, возвращая адрес, где этот символ загружен в память.

Так что он возвращает не указатель на функцию, а стандартный указатель! Должно работать что-то следующее:

void* returnedAddress = dlsym(handle , "fun");
fnptr = reinterpret_cast<void(*)()>(returnedAddress);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector