在 Linux (eclipse) 中使用 C++ 库
Posted
技术标签:
【中文标题】在 Linux (eclipse) 中使用 C++ 库【英文标题】:Using C++ Library in Linux (eclipse) 【发布时间】:2009-06-05 14:47:50 【问题描述】:我写了一个库并想测试它。我编写了以下程序,但我从 eclipse 中收到一条错误消息。
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv)
void *handle;
double (*desk)(char*);
char *error;
handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
if (!handle)
fputs (dlerror(), stderr);
exit(1);
desk= dlsym(handle, "Apply"); // ERROR: cannot convert from 'void *' to 'double*(*)(char*)' for argument 1
if ((error = dlerror()) != NULL)
fputs(error, stderr);
exit(1);
dlclose(handle);
怎么了?
问候。
【问题讨论】:
如果这是 C++,为什么它看起来这么像 C? 【参考方案1】:在 C++ 中,您需要以下内容:
typedef double (*func)(char*);
func desk = reinterpret_cast<func>( dlsym(handle, "Apply"));
【讨论】:
是的,html 吃掉了我的尖括号 :) 固定,thatnks。 现在我得到了这个例外:未定义的对'dlerror' ...'dlsqm' ...'dlclose'的引用你知道解决方案吗?斯帕西博! 我在下面说过,但我也会在这里添加:您是否在 dl 中进行链接?尝试在编译器命令行中添加“-ldl”。【参考方案2】:您需要显式转换 dlsym() 的返回值,它返回一个 void* 并且desk 不是 void* 类型。像这样:
desk = (double (*)(char*))dlsym(handle, "some_function");
【讨论】:
呃,我没想到。我尽可能多地显式施法,我不喜欢隐式施法的隐藏乐趣。我将删除关于 C 与 C++ 的争论。 这可能在 C 编译器中编译,对吧? C++ 编译器将需要强制转换。还是我错了? (抱歉 -- 已删除评论,然后重新添加 -- 令人困惑) 在这种情况下,为函数指针添加 typedef 通常会很好,这样您就可以强制转换它,而不会让代码行看起来像一堆括号和星号。 现在我得到了这个例外:未定义的对'dlerror' ...'dlsqm' ...'dlclose'的引用你知道解决方案吗?【参考方案3】:基本上,在将 dlsym 分配给桌面时,您需要对它的返回值应用强制转换。在this article 中,他们将 void* 返回到他们的函数指针。
看this article。
【讨论】:
以上是关于在 Linux (eclipse) 中使用 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章
在 Eclipse、Red Hat Linux 中运行 c++ 项目时出现问题
C++ - 将 C++ 代码从 Visual Studio 移植到 Linux Eclipse IDE 时出现问题