我想用g ++编译以下简单的DL库示例代码Program-Library-HOWTO。这只是一个例子,所以我可以学习如何使用和编写共享库。我正在开发的库的真实代码将用C++编写。使用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: error: invalid conversion from 'void*' to 'double (*)(double)'
我了解(我认为我明白,如果指正这是错误的),我不能在C++中使用void指针进行隐式转换,但C让我,这就是为什么上面的代码将使用gcc编译而不是使用usin g g ++。因此,我通过改变上述行16试过一个显式的:
cosine = (double *)dlsym(handle, "cos");
有了这个地方,我得到以下错误:
foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment
这些问题可能有更多的事情要做我自己一般的无知适当的C++编码标准。任何人都可以点我一个关于开发使用C++示例代码的Linux动态库的好教程吗?
我建议通过“在C++中思考”来加快C++的速度。正如你正确的发现,你不能隐式地从void *转换到C++中的其他指针,这意味着你真的只需要在C++而不是其他区域上加快速度:) – workmad3 2009-01-27 15:34:14
谢谢,我正在阅读C++ Primer在业余时间,但现在我有一个项目到期。 – 2009-01-27 15:36:12