Я пытаюсь скомпилировать следующий простой пример кода библиотеки DL из Program-Library-HOWTO с помощью g ++. Это всего лишь пример, поэтому я могу научиться использовать и писать общие библиотеки. Настоящий код библиотеки, которую я разрабатываю, будет написан на C ++.
#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 ++, но C позволяет мне, и именно поэтому Приведенный выше код будет компилироваться с использованием gcc, но не с использованием g ++. Поэтому я попробовал явное приведение, изменив строку 16 выше на:
cosine = (double *)dlsym(handle, "cos");
При этом я получаю следующую ошибку:
foo.cpp: 16: ошибка: невозможно преобразовать 'double *' в 'double (*) (double)' в присваивании
Эти проблемы, вероятно, больше связаны с моим собственным общим незнанием надлежащих стандартов кодирования C ++, чем с чем-либо еще. Может кто-нибудь указать мне хороший учебник по разработке динамических библиотек для Linux, который использует пример кода C ++?