2009-06-05 63 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