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

C++ Discussion :

Méthode d'interfaçage C++ / Lua


Sujet :

C++

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut Méthode d'interfaçage C++ / Lua
    Bonjour, dans le cadre de mon projet de recherche, j'ai développé une application faisant certains calculs. Suivant les cas, les exemples que je veux calculer, je dois instancier ou non certains objets, les initialiser avec différentes valeurs, etc. En gros, d'une exécution sur l'autre, les calculs doivent être différents. Sauf que voilà, le projet devient assez gros pour que tout recompiler à chaque fois devienne non négligeable.
    Justement, il se trouve que j'ai entendu parler des langages de script. Intéressant, de pouvoir changer le comportement du programme sans tout recompiler. Et, a priori, Lua me semblait être ce qu'il me fallait. Sauf que voilà, c'est un langage interprété, c'est donc a priori plus lent, et je ne peux pas me permettre la lenteur, les calculs sont importants.

    Donc voilà mon interrogation :

    - On peut appeler des fonctions Lua depuis C++ ;
    - On peut appeler des fonctions C++ depuis Lua ;
    Moi, ce dont j'aurais besoin, ce serait de créer un script de création des différents objets C++ dont j'ai besoin et d'appeler les méthodes appropriées. Alors que faut-il faire ?
    - Faut-il créer un script Lua qui exécute des bouts de programme C++ ?
    - Faut-il créer un petit programme qui se charge d'interpréter le script Lua, qui lui-même instancie des objets ?

    Et surtout, ce qui m'intéresse, c'est les temps d'exécution. Aujourd'hui mon programme tourne bien. Donc a priori les scripts Lua rallongeraient un peu ; lorsqu'on crée un objet C++ depuis Lua ou qu'on appelle une fonction C/C++, le temps d'exécution de la fonction est bien le même que celui de départ ? L'augmentation de temps d'exécution est-elle uniquement liée à l'interprétation de la commande Lua (sachant qu'après tout est exécuté en C++) ?

    Merci d'avance, je cherche un moyen de faire en sorte que le temps d'exécution additionnel ne soit proportionnel qu'au nombre d'appels & de créations d'objets, et non à la complexité du programme.

    Le Barde.
    Hayiiiiiiiiiiiiii !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu laisses tout le code critique côté C++ et ne fais que le strict minimum côté Lua, tu ne payeras effectivement que le coût de l'interprétation des commandes Lua en plus.

  3. #3
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Récemment j'ai vu passer sur le forum un lien vers swig. Cela permet de faire automatiquement le binding C++->script. Au vu des tutoriaux, cela a l'air assez simple au premier abord.

    HIH

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    SWIG n'est pas exactement le bon outil pour interfacer C++ et Lua, il sert plutôt à créer un binding d'une bibliothèque C++.

    Pour utiliser Lua dans un programme codé en C++, il faut utiliser des bibliothèques du genre ToLua ou luabind.

  5. #5
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    D'accord, merci, vous me rassurez grandement

    Donc, si j'ai bien compris la leçon...
    1. On crée un certain nombre de fonctions en C++ d'interfaçage avec Lua ;
    2. On fait appel dans le programme principal (ou ailleurs ^^) à une fonction Lua, contenue dans un script Lua ;
    3. Dans ladite fonction écrite en Lua, qui sert de "fonction principale", on peut faire appel à ces fonctions d'interface écrites en C++ ?
    Hayiiiiiiiiiiiiii !

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 28
    Points
    28
    Par défaut
    J'ai regardé un peu luabind, et oui il te permet de faire ce genre de chose. Tu peux aussi faire si je me trompe pas une bibliotheque qui exporte tes fonctions C++ pour quelles soit utilisable en LUA, donc tu peux par exemple faire ton script principale en LUA et quand tu as besoin de perf tu utilises les fonctions de ta bibliotheque.

  7. #7
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    D'accord, merci beaucoup pour vos idées & suggestions

    Pour l'instant, mon programme sait appeler une fonction Lua définie et décrite dans un script (finalement ni plus ni moins qu'un Hello World) ; le script sait appeler des fonctions C/C++ enregistrées au préalable, mais pour l'instant ça ne va pas plus loin.

    Par contre un élément qui me gêne beaucoup est le fait qu'il faille faire le binding, c'est-à-dire régénérer par un programme tiers un ficher .h lorsqu'on veut modifier / ajouter une méthode, etc. ; ce qui me gêne, c'est que ce n'est pas automatique.

    - Connaîtriez-vous un moyen de lancer la commande "tolua -o machin.h machin.pkg" avant chaque compilation, à l'appel de make ?
    - Ou à défaut, connaîtriez-vous un langage de script (non compilé, pas comme UnrealScript) qui s'intègre facilement comme Lua et qui gère les classes / objets ?
    Hayiiiiiiiiiiiiii !

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par contre un élément qui me gêne beaucoup est le fait qu'il faille faire le binding, c'est-à-dire régénérer par un programme tiers un ficher .h lorsqu'on veut modifier / ajouter une méthode, etc. ; ce qui me gêne, c'est que ce n'est pas automatique.
    luabind fonctionne différemment : le binding est effectué dans le code C++, ce qui fait que tu n'as aucun fichier à régénérer, il faut juste recompiler après chaque ajout.

    - Ou à défaut, connaîtriez-vous un langage de script (non compilé, pas comme UnrealScript) qui s'intègre facilement comme Lua et qui gère les classes / objets ?
    Python, avec boost.python. Mais Lua est très bien, pas besoin de chercher autre chose

  9. #9
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    D'accord, merci.
    Eh bien je m'en tiendrai là pour ce sujet, vous m'avez grandement aidé ! En attendant, j'avais essayé d'installer LuaBind, mais il n'est pas proposé en natif sous Ubuntu (que j'utilise, donc) et l'installation demande de créer des variables d'environnement... que j'ai créées, mais ecla ne fonctionne pas. Enfin, j'ai regardé le tutoriel utilisant Lunar, et cela a l'air de fonctionner... Je vais prendre ça pour l'instant, en attendant de passer à la version Lua 5.1 (j'ai un conflit des versions avec LuaBind, et j'avoue que je préfère laisser là pour Lunar, qui est plus simple de prime abord).

    Merci, je considère mon problème comme résolu, j'ai été rassuré comme je l'espérais et j'ai eu des bonnes pistes

    Bonne journée à tous,
    Le Barde.
    Hayiiiiiiiiiiiiii !

  10. #10
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Mince, du nouveau : l'en-tête lunar.h, que voici, donne une erreur à la compilation.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    // Fichier en-tête du binding Lunar, proposé par http://lua-users.org/ à l'adresse :
    // http://lua-users.org/wiki/CppBindingWithLunar
     
    // Fichier créé par Le Barde le Jeu 30 août 2007
    // Version de Lua utilisée : Lua 5.0
     
    #ifndef lunar_H
    #define lunar_H
     
     
    extern "C" {
    #include "lua.h"
    #include "lauxlib.h"
    }
     
    template <typename T> class Lunar {
      typedef struct { T *pT; } userdataType;
    public:
      typedef int (T::*mfp)(lua_State *L);
      typedef struct { const char *name; mfp mfunc; } RegType;
     
      static void Register(lua_State *L) {
        lua_newtable(L);
        int methods = lua_gettop(L);
     
        luaL_newmetatable(L, T::className);
        int metatable = lua_gettop(L);
     
        // store method table in globals so that
        // scripts can add functions written in Lua.
        lua_pushvalue(L, methods);
        set(L, LUA_GLOBALSINDEX, T::className);
     
        // hide metatable from Lua getmetatable()
        lua_pushvalue(L, methods);
        set(L, metatable, "__metatable");
     
        lua_pushvalue(L, methods);
        set(L, metatable, "__index");
     
        lua_pushcfunction(L, tostring_T);
        set(L, metatable, "__tostring");
     
        lua_pushcfunction(L, gc_T);
        set(L, metatable, "__gc");
     
        lua_newtable(L);                // mt for method table
        lua_pushcfunction(L, new_T);
        lua_pushvalue(L, -1);           // dup new_T function
        set(L, methods, "new");         // add new_T to method table
        set(L, -3, "__call");           // mt.__call = new_T
        lua_setmetatable(L, methods);
     
        // fill method table with methods from class T
        for (RegType *l = T::methods; l->name; l++) {
          lua_pushstring(L, l->name);
          lua_pushlightuserdata(L, (void*)l);
          lua_pushcclosure(L, thunk, 1);
          lua_settable(L, methods);
        }
     
        lua_pop(L, 2);  // drop metatable and method table
      }
     
      // call named lua method from userdata method table
      static int call(lua_State *L, const char *method,
                      int nargs=0, int nresults=LUA_MULTRET, int errfunc=0)
      {
        int base = lua_gettop(L) - nargs;  // userdata index
        if (!luaL_checkudata(L, base, T::className)) {
          lua_settop(L, base-1);           // drop userdata and args
          lua_pushfstring(L, "not a valid %s userdata", T::className);
          return -1;
        }
     
        lua_pushstring(L, method);         // method name
        lua_gettable(L, base);             // get method from userdata
        if (lua_isnil(L, -1)) {            // no method?
          lua_settop(L, base-1);           // drop userdata and args
          lua_pushfstring(L, "%s missing method '%s'", T::className, method);
          return -1;
        }
        lua_insert(L, base);               // put method under userdata, args
     
        int status = lua_pcall(L, 1+nargs, nresults, errfunc);  // call method
        if (status) {
          const char *msg = lua_tostring(L, -1);
          if (msg == NULL) msg = "(error with no message)";
          lua_pushfstring(L, "%s:%s status = %d\n%s",
                          T::className, method, status, msg);
          lua_remove(L, base);             // remove old message
          return -1;
        }
        return lua_gettop(L) - base + 1;   // number of results
      }
     
      // push onto the Lua stack a userdata containing a pointer to T object
      static int push(lua_State *L, T *obj, bool gc=false) {
        if (!obj) { lua_pushnil(L); return 0; }
        luaL_getmetatable(L, T::className);  // lookup metatable in Lua registry
        if (lua_isnil(L, -1)) luaL_error(L, "%s missing metatable", T::className);
        int mt = lua_gettop(L);
        subtable(L, mt, "userdata", "v");
        userdataType *ud =
          static_cast<userdataType*>(pushuserdata(L, obj, sizeof(userdataType)));
        if (ud) {
          ud->pT = obj;  // store pointer to object in userdata
          lua_pushvalue(L, mt);
          lua_setmetatable(L, -2);
          if (gc == false) {
            lua_checkstack(L, 3);
            subtable(L, mt, "do not trash", "k");
            lua_pushvalue(L, -2);
            lua_pushboolean(L, 1);
            lua_settable(L, -3);
            lua_pop(L, 1);
          }
        }
        lua_replace(L, mt);
        lua_settop(L, mt);
        return mt;  // index of userdata containing pointer to T object
      }
     
      // get userdata from Lua stack and return pointer to T object
      static T *check(lua_State *L, int narg) {
        userdataType *ud =
          static_cast<userdataType*>(luaL_checkudata(L, narg, T::className));
        if(!ud) luaL_typerror(L, narg, T::className);
        return ud->pT;  // pointer to T object
      }
     
    private:
      Lunar();  // hide default constructor
     
      // member function dispatcher
      static int thunk(lua_State *L) {
        // stack has userdata, followed by method args
        T *obj = check(L, 1);  // get 'self', or if you prefer, 'this'
        lua_remove(L, 1);  // remove self so member function args start at index 1
        // get member function from upvalue
        RegType *l = static_cast<RegType*>(lua_touserdata(L, lua_upvalueindex(1)));
        return (obj->*(l->mfunc))(L);  // call member function
      }
     
      // create a new T object and
      // push onto the Lua stack a userdata containing a pointer to T object
      static int new_T(lua_State *L) {
        lua_remove(L, 1);   // use classname:new(), instead of classname.new()
        T *obj = new T(L);  // call constructor for T objects
        push(L, obj, true); // gc_T will delete this object
        return 1;           // userdata containing pointer to T object
      }
     
      // garbage collection metamethod
      static int gc_T(lua_State *L) {
        if (luaL_getmetafield(L, 1, "do not trash")) {
          lua_pushvalue(L, 1);  // dup userdata
          lua_gettable(L, -2);
          if (!lua_isnil(L, -1)) return 0;  // do not delete object
        }
        userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, 1));
        T *obj = ud->pT;
        if (obj) delete obj;  // call destructor for T objects
        return 0;
      }
     
      static int tostring_T (lua_State *L) {
        char buff[32];
        userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, 1));
        T *obj = ud->pT;
        sprintf(buff, "%p", obj);
        lua_pushfstring(L, "%s (%s)", T::className, buff);
        return 1;
      }
     
      static void set(lua_State *L, int table_index, const char *key) {
        lua_pushstring(L, key);
        lua_insert(L, -2);  // swap value and key
        lua_settable(L, table_index);
      }
     
      static void weaktable(lua_State *L, const char *mode) {
        lua_newtable(L);
        lua_pushvalue(L, -1);  // table is its own metatable
        lua_setmetatable(L, -2);http://lua-users.org/wiki/CppBindingWithLunar
        lua_pushliteral(L, "__mode");
        lua_pushstring(L, mode);
        lua_settable(L, -3);   // metatable.__mode = mode
      }
     
      static void subtable(lua_State *L, int tindex, const char *name, const char *mode) {
        lua_pushstring(L, name);
        lua_gettable(L, tindex);
        if (lua_isnil(L, -1)) {
          lua_pop(L, 1);
          lua_checkstack(L, 3);
          weaktable(L, mode);
          lua_pushstring(L, name);
          lua_pushvalue(L, -2);
          lua_settable(L, tindex);
        }
      }
     
      static void *pushuserdata(lua_State *L, void *key, size_t sz) {
        void *ud = 0;
        lua_pushlightuserdata(L, key);
        lua_gettable(L, -2);     // lookup[key]
        if (lua_isnil(L, -1)) {
          lua_pop(L, 1);         // drop nil
          lua_checkstack(L, 3);
          ud = lua_newuserdata(L, sz);  // create new userdata
          lua_pushlightuserdata(L, key);
          lua_pushvalue(L, -2);  // dup userdata
          lua_settable(L, -4);   // lookup[key] = userdata
        }
        return ud;
      }
    };
     
    #endif
    Quand je l'inclus dans mon projet, cela donne au make :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cd '/home/adrien/Documents/Travail/recherche/StageFlowShop/C++' && QTDIR="/usr/share/qt3" make -j1 
    g++ -c -pipe -Wall -W -g -D_REENTRANT -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/share/qt3/mkspecs/default -I. -I/usr/include/qt3 -o Application.o Application.cpp
    /usr/include/lua50/lunar.h:21: erreur: patron avec liaison C
    Application.cpp: In function «int main(int, char**)":
    Application.cpp:167: attention : comparaison entre des expressions entières signée et non signée
    Application.cpp:171: attention : comparaison entre des expressions entières signée et non signée
    Application.cpp:213: attention : comparaison entre des expressions entières signée et non signée
    Application.cpp:216: attention : comparaison entre des expressions entières signée et non signée
    Application.cpp: At global scope:
    Application.cpp:54: attention : unused parameter «argc"
    Application.cpp:54: attention : unused parameter «argv"
    make: *** [Application.o] Erreur 1
    *** Exited with status: 2 ***
    Bizarre... non ?
    Hayiiiiiiiiiiiiii !

  11. #11
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Les messages systèmes en "Français" me laissent toujours perplexe... (je ne critique pas les traducteurs hein !).

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    D'après le message d'erreur, je m'attendrais à voir un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    extern "C" {
     
    template <typename T> class Lunar
    ...
     
    }
    Mais ça n'a pas l'air d'être le cas. Tu es sûr qu'il n'y a pas un extern "C" qui reste ouvert dans l'un des différents en-têtes ?

  13. #13
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Waaaaaah, en effet !

    J'avais voulu regrouper les include dans mon programme principal de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Bibliohtèques Lua
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    #include <lua50/lua.h>
    #include <lua50/lauxlib.h>
    #include <lua50/lualib.h>
    // Bibliothèque Lunar.
    #include <lua50/lunar.h>
    #ifdef __cplusplus
    }
    #endif
    Bien vu, je m'incline.
    Le Barde.
    Hayiiiiiiiiiiiiii !

  14. #14
    Membre chevronné

    Homme Profil pro
    Appui fonctionnel senior
    Inscrit en
    Juin 2007
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Appui fonctionnel senior
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 461
    Points : 2 211
    Points
    2 211
    Par défaut
    Bonjour,
    Actuellement je voudrais utiliser luabind pour lier mon application C++ à Lua, mais je rencontre des problèmes de liens
    (Les liens avec Lua ( 5.0 ) , la librairie standard est bien faite, ainsi que la liaison avec luabind) :


    obj\x86\Debug Win32\Sources\LuaBindDemo.o||In function `main'
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|30|undefined reference to `luabind::open(lua_State*)'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|32|undefined reference to `luabind::module_::operator[](luabind::scope)'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|32|undefined reference to `luabind::scope::~scope()'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|32|undefined reference to `luabind::scope::~scope()'|
    obj\x86\Debug Win32\Sources\LuaBindDemo.o||In function `ZN5boost6detail8function15functor_managerIPFiP9lua_StateESaINS_13function_baseEEE7managerERKNS1_15function_bufferERSA_NS1_30functor_manager_operation_typeENS1_16function_ptr_tagE'
    )]+0x1b)||undefined reference to `luabind::module_::module_(lua_State*, char const*)'|
    obj\x86\Debug Win32\Sources\LuaBindDemo.o||In function `Z5greetv'
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|22|undefined reference to `luabind::scope::scope(std::auto_ptr<luabind::detail::registration>)'|
    obj\x86\Debug Win32\Sources\LuaBindDemo.o||In function `ZN5boost6detail8function15functor_managerIPFiP9lua_StateESaINS_13function_baseEEE7managerERKNS1_15function_bufferERSA_NS1_30functor_manager_operation_typeENS1_16function_ptr_tagE'
    )]+0xd)||undefined reference to `luabind::detail::registration::registration()'|
    ::~function_commiter()]+0x16)||undefined reference to `luabind::detail::registration::~registration()'|
    ::~function_commiter()]+0x16)||undefined reference to `luabind::detail::registration::~registration()'|
    obj\x86\Debug Win32\Sources\LuaBindDemo.o||In function `GLOBAL__D__ZN7luabind69_GLOBAL__N_H__Perso_LuaBind_Sources_LuaBindDemo.cpp_2E77F885_2D4950BB5yieldE'
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|98|undefined reference to `luabind::detail::ref(lua_State*)'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|98|undefined reference to `luabind::detail::class_registry::get_registry(lua_State*)'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|98|undefined reference to `luabind::detail::free_functions::function_dispatcher(lua_State*)'|
    H:\Perso\LuaBind\Sources\LuaBindDemo.cpp|98|undefined reference to `luabind::detail::free_functions::function_rep::add_overload(luabind::detail::free_functions::overload_rep const&)'|
    ||=== Build finished: 13 errors, 0 warnings ===|

    Je regardais dans la librairie libluabind.a et apparement les fonctions existes bien : résultat, je comprend plus rien
    J'ai regardais sur internet, mais je ne trouve rien qui résolve mon mon problème.
    Donc si quelqu'un peut m'aider, merci d'avance

    P.S: j'utilise CodeBlocks avec GCC 3.4.4 ( sous Windaube )

  15. #15
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    J'avais eu des problèmes d'édition des liens équivalents à l'époque, surtout ceux du type :
    undefined reference to `luabind::open(lua_State*)'
    Je ne me souviens plus exactement du problème, mais il me semble que c'était lié à la version de LUA que tu utilises ; je crois que pour utiliser une version récente de LuaBind, il faut utiliser LUA 5.1 (mais à onfirmer)...
    Hayiiiiiiiiiiiiii !

  16. #16
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    effectivement, pour utiliser les derniere version de luabind, il faut passer a lua 5.1
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Même problème
    J'ai la même erreur pourtant j'utilise bien lua 5.1. Faut-il une librairie en plus de liblua50.a. Si oui laquel?

    Merci d'avance.

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 308
    Points : 622
    Points
    622
    Par défaut
    je remonte le sujet.
    j'ai le même problème que bekir.

    Edit :
    Résolu, j'ai suivit la procédure de cet article

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

Discussions similaires

  1. Le principe de méthode interfaçage
    Par guinda dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 29/09/2013, 23h24
  2. Méthode d'interfaçage entre Matlab et Java
    Par msassoum dans le forum Général Java
    Réponses: 2
    Dernier message: 07/02/2010, 09h26
  3. Redéfinition de méthode C# avec Lua
    Par fseg_ dans le forum C#
    Réponses: 0
    Dernier message: 31/08/2009, 16h40
  4. Interfaçage Lua Lunar C++
    Par GoldenEye dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 21/10/2008, 22h29
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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