2009-06-05 6 views
1

J'ai écrit une bibliothèque et je veux la tester. J'ai écrit le programme suivant, mais j'obtiens un message d'erreur d'eclipse.Utilisation de la bibliothèque C++ sous Linux (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); 
} 

Qu'est-ce qui ne va pas?

Cordialement.

+1

Si cela est C++, pourquoi est-il ressembles tellement C? –

Répondre

3

En C++, vous avez besoin:


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

Votre syntaxe pour reinterpret_cast est incorrecte. –

+0

Oui, html a mangé mes parenthèses d'angle :) Fixe, thatnks. –

+0

Maintenant, je reçois cette exeption: référence non définie à 'dlerror' ... 'dlsqm' ... 'dlclose' Connaissez-vous une solution? Spasibo! – user101375

2

Vous devez convertir explicitement la valeur de retour de dlsym(), il renvoie un vide * et desk n'est pas de type void *. Comme ceci:

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

+1

Euh, je n'y ai pas pensé. Je jette explicitement autant que je peux, je n'aime pas le plaisir caché des lancers implicites. Je vais supprimer le ding sur C vs C++. – kbyrd

+1

Cela peut compiler dans un compilateur C, non? Un compilateur C++ nécessitera le cast. Ou ai-je tort? –

+0

(désolé - supprimé le commentaire, puis ajouté - confus) –

0

Fondamentalement, vous devez appliquer un plâtre à la valeur de retour de dlsym lors de l'affectation à un bureau. Dans this article, ils lancent le void * retour à leur pointeur de fonction.

Regardez this article.

Questions connexes