2009-06-05 66 views
1

我写了一个库,想测试它。我写了下面的程序,但是我从eclipse得到了一条错误消息。在Linux中使用C++库(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); 
} 

出了什么问题?

问候。

+1

如果这是C++,它为什么长得这么像C? – 2009-06-05 15:16:51

回答

3

在C++中,你需要以下条件:


typedef double (*func)(char*); 
func desk = reinterpret_cast<func>(dlsym(handle, "Apply")); 
+1

您的reinterpret_cast语法错误。 – 2009-06-05 15:08:16

+0

是的,html吃了我的尖括号:)修正了,thatnks。 – 2009-06-05 15:29:34

+0

现在我明白了这个问题:未定义的引用'dlerror'...'dlsqm'...'dlclose'你知道一个解决方案吗? Spasibo! – user101375 2009-06-05 15:54:26

2

您需要明确地转换dlsym()的返回值,它将返回一个void *,而且桌面不是void *类型。就像这样:

desk = (double (*)(char*))dlsym(handle, "some_function");

+1

呵呵,我没有想过。我尽可能多地表演,我不喜欢隐式演员的隐藏乐趣。我将删除有关C和C++的ding。 – kbyrd 2009-06-05 14:56:44

+1

虽然这可能会在C编译器中编译,对吧? C++编译器将需要强制转换。或者我错了? – 2009-06-05 14:57:03

+0

(对不起 - 已删除的评论,然后重新添加 - 令人困惑) – 2009-06-05 14:57:27

0

基本上你需要将其分配给台时铸造适用于对dlsym的返回值。在this article中,他们将void * return转换为它们的函数指针。

看看this article