IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

faire appel à une fonction qui existe dans un .so


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut faire appel à une fonction qui existe dans un .so
    Salut,
    j'ai une librairie .so et j'essaye de faire un appel à une fonction qui existe dans ce .so.
    voilà mon code ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
      cout << "Opening hello.so...\n";
    	    void* handle = dlopen("./lib.so", RTLD_LAZY);
     
    	    if (!handle) {
    	        cerr << "Cannot open library: " << dlerror() << '\n';
    	        return 1;
    	    }
     
     
    	    // load the symbol
    	    cout << "Loading symbol Data...\n";
    	    char const *nativeString ="/root/Desktop/dll/testLib";
    	    int const  v1=1,v2=1,v3=1,v4=1,v5=1,v6=1,v7=1,v8=1;
    	    float const  v9=1;
    	    typedef int(*function_t)(char const *,int const,int const,int const,int const,int const,int const,int const,int const,float const &);
    	    function_t*   fonc = (function_t*)dlsym(handle, "myFunction");
     
    	        // reset errors
    	        const char *dlsym_error = dlerror();
    	        if (dlsym_error) {
    	            cerr << "Cannot load symbol 'Data': " << dlsym_error <<
    	                '\n';
    	            dlclose(handle);
    	            return 1;
    	        }
     
    	        cout << "Calling myFunction...\n";
    	        fonc(nativeString,v1,v2,v3,v4,v5,v6,v7,v8,v9);
     
    	        // close the library
    	        cout << "Closing library...\n";
    	        dlclose(handle);
    l'erreur qui m'affiche c'est: " ‘fonc’ cannot be used as a function "
    et voilà mon fonction dans le fichier .h (qui existe dans le .so):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    int processData(char const * var1, int const var2,	int const var3, int const var4,int const var5, int const var6,int const var7, int const var8,int const var9,float const & var10);
     
    #ifdef __cplusplus
    }
    #endif
    franchement j'ai essayé plusieurs syntaxe mais g pas réussi à trouver le bon, en fait moi je travaille avec JAVA mais g besoin d'utiliser une librairie .so developpée en c++ dans mon code.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Ton pointeur sur fonction ne devrait-il pas être déréférencé, comme dans:

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    je pense pas car si j'utilise *fonc(...), il m'affiche le même erreur " ‘fonc’ cannot be used as a function "
    et si j'utilise (*fonc)(...) il m'affiche les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ./src/appelSo.o: In function `main':
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:20: undefined reference to `dlopen'
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:23: undefined reference to `dlerror'
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:34: undefined reference to `dlsym'
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:37: undefined reference to `dlerror'
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:41: undefined reference to `dlclose'
    /root/Desktop/logiciels/eclipse/workspace/appelSo/Debug/../src/appelSo.cpp:50: undefined reference to `dlclose'
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [appelSo] Erreur 1
     
    **** Build Finished ****

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Tu utilises quoi comme commande pour compiler? Et pour linker? Tu as des problèmes de link, le linker ne trouve pas les so.

  5. #5
    screetch
    Invité(e)
    Par défaut
    link avec "dl" (-ldl sur la ligne de commande)
    aussi, je te conseille de pas compiler en root, m'enfin bon chacun fait comme il veut hein

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    j'utilise eclipse c/c++ sous centos(linux) pour compiler et non pas une ligne de commande
    mais g placé le .so dans le même dossier de mon fichier.cpp donc normalement il le voit en tappant './lib.so' ??

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    il faut ajouter libLd.so dans les librairies utilisées dans la configuration de ton projet (je suppose que c'est du CDT), sinon ça ne linkera pas (erreur ld).
    Par ailleurs, concernant lib.so, ce n'est pas le chemin de ton cpp qui compte, il faut que le fichier soit dans ton PATH au moment de l'exécution.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    g ajouté 'libdl' dans Properties-->c/c++ Build-->settings-->GCC c++ Linker-->Librairies (l)
    il m'affiche le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $
    /usr/bin/ld: cannot find -llibdl
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [appelSo] Erreur 1
    mais dans /usr/bin/ il y a des commandes seulement et le fichier libdl.so se trouve dans /usr/lib/

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    J'aurais dû être plus explicite, désolé. Il faut ajouter la lib sous le nom dl, le linker complètera automatiquement en libdl.so et la trouvera tout seul.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    oui tu as raison, il faut juste ajouter dl et non pas libdl.so
    merci, merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/07/2009, 22h44
  2. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  3. Réponses: 2
    Dernier message: 06/03/2008, 21h20
  4. Réponses: 4
    Dernier message: 08/08/2007, 17h36
  5. appel d'une fonction qui est dans une autre page
    Par guppy33 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/08/2006, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo