【发布时间】:2010-10-03 18:49:33
【问题描述】:
我正在尝试使用 g++ 从Program-Library-HOWTO 编译以下简单的 DL 库示例代码。这只是一个示例,因此我可以学习如何使用和编写共享库。我正在开发的库的真实代码将用 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)' 的无效转换
我理解(我认为我理解,如果有错误请纠正我)我不能从 C++ 中的 void 指针进行隐式转换,但 C 允许我这样做,这就是为什么上面的代码将使用 gcc 但不使用 g++ 编译。所以我通过将上面的第 16 行更改为:
cosine = (double *)dlsym(handle, "cos");
有了这个,我得到以下错误:
foo.cpp:16: 错误:不能在赋值中将 'double*' 转换为 'double (*)(double)'
这些问题可能更多地与我自己对适当的 C++ 编码标准的普遍无知有关,而不是其他任何事情。谁能给我一个关于使用 C++ 示例代码为 Linux 开发动态库的好教程?
【问题讨论】:
-
我建议通过“用 C++ 思考”来了解 C++。正如您正确发现的那样,您不能从 void* 隐式转换为 C++ 中的其他指针,这意味着您真的只需要了解 C++ 而不是其他领域 :)
-
谢谢,我在业余时间阅读 C++ Primer,但现在我有一个项目到期。
标签: c++ linux g++ shared-libraries