#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: error: invalid conversion from 'void*' to 'double (*)(double)'
我理解(如果我错了请指出)C++中不能从void指针进行隐式转换,但是在C语言中可以。这就是为什么上述代码在使用gcc编译时会成功,但在使用g++编译时不会成功的原因。因此,我尝试通过将第16行代码更改为以下内容来显式转换:
cosine = (double *)dlsym(handle, "cos");
在这种情况下,我收到以下错误:
foo.cpp:16: 错误:无法将“double *”转换为“double (*)(double)”
这些问题可能更多地与我自己对正确的C++编码标准的无知有关。是否有人可以指点我一份在Linux上开发动态库并使用C++示例代码的好教程?