Я пытаюсь скомпилировать следующий простой пример библиотеки DL библиотеки из Program-Library-HOWTO с g++. Это просто пример, поэтому я могу научиться использовать и писать разделяемые библиотеки. Настоящий код для библиотеки, которую я разрабатываю, будет написан на С++.
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}
Если я скомпилирую программу с помощью gcc, она отлично работает.
gcc -o foo foo.c -ldl
Когда я изменяю имя файла и компилятор на следующий
g++ -o foo foo.cpp -ldl
Я получаю следующую ошибку:
foo.cpp: 16: ошибка: неверное преобразование из 'void *' в 'double (*) (double)'
Я понимаю (я думаю, что понимаю, исправьте меня, если это не так), что я не могу сделать неявный приведение из указателя void в С++, но C позволяет мне, и поэтому приведенный выше код будет скомпилирован с использованием gcc но не используя g++. Поэтому я попробовал явное преобразование, изменив строку 16 выше:
cosine = (double *)dlsym(handle, "cos");
При этом я получаю следующую ошибку:
foo.cpp: 16: error: невозможно преобразовать 'double *' в 'double (*) (double)' в присваивании
Эти проблемы, вероятно, больше связаны с моим собственным общим незнанием надлежащих стандартов кодирования на С++, чем с чем-либо еще. Может ли кто-нибудь указать мне хороший учебник по разработке динамических библиотек для Linux, который использует код примера С++?