8
votes

Intégrer Lua en C ++

Je veux écrire un programme C ++ pouvant interagir / appeler Lua-scripts lors de l'exécution. Un concept clé du programme est une indépendance complète de la plate-forme, mais il semble que je ne puisse pas être incapable de localiser une construction de Lua qui offre réellement quelque chose.

Les constructions Lua que j'ai trouvées jusqu'à présent sont basées sur des variables d'environnement ou des bibliothèques spécifiques telles que .lib , .dll ou .so . La source officielle de Lua.org n'est également pas ce que je recherche comme il définit un Fonction ...

Y a-t-il un cas simple - le meilleur cas serait quelque chose comme Sqlite-amalgamation - Lua-Interprète pour C / C ++ qui n'a pas de ces dépendances?


0 commentaires

3 Réponses :


8
votes

lua.c contient principal et définit le point d'entrée d'une application de console. Si vous le supprimez du projet, ce qui reste à gauche construit dans une liberme autonome, ou une bibliothèque dynamique si vous préférez, bien.


3 commentaires

Merci pour votre réponse! Il suffit de remarquer que Lua.c (interpréteur autonome) et luac.c (le compilateur Lua-to-bytecode) contiennent un peu bizarre que la source n'est pas séparée dans différents dossiers ...


@MFH, cette organisation est assez typique des projets classiques de fabrication de maquillage. Notez l'âge total de LUA. Le maquillage construit (en fonction de la plate-forme) à la fois une bibliothèque statique et dynamique du noyau, puis compilez Lua.c et LUAC.C liée à eux selon le cas.


AHA, honnêtement, bien que j'utilise un peu de fabricants, je ne leur ai jamais vraiment grandi et j'ai toujours divisé les applications en différents dossiers ...



8
votes

Voici ce que j'utilise comme point de départ pour mes projets (j'ai trouvé quelque chose de similaire au dos et l'a adapté pour que je puisse le changer plus vite):


Le fichier de script Lua: P >

    #include <stdlib.h>
    #include <stdio.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>
    
    int main(char argv[], int argc) {
            static const luaL_reg lualibs[] = {
                    { "base",       luaopen_base },
                    { NULL,         NULL }
            };
    
            static void openlualibs(lua_State *l) {
                    const luaL_Reg *lib;
    
                    for (lib = lualibs; lib->func != NULL; lib++) {
                            lib->func(l);
                            lua_settop(l, 0);
                    }
            }
    
            lua_State *l;
            l = lua_open();
            openlualibs(l);
    
            printf("now calling lua\n\n");
            lua_dofile(l, "myscript.lua");
            printf("\ndo something else\n\n");
    
            lua_close(l);
            return 0;
    }


1 commentaires

LUAL_REG doit être LUAL_REG



4
votes

Pour une construction d'amalgamation mono-file de l'interprète Lua Core et autonome, voir le fichier etc / tout.c dans le kit source officiel. Vous pouvez certainement l'utiliser comme base de votre propre amalgamation, peut-être en éliminant la référence à lua.c sur la dernière ligne.

De nombreuses applications plus grandes qui incorporent Lua le font simplement en ajoutant simplement les fichiers source de base au projet. Ceci est particulièrement efficace si l'application entend ne pas autoriser le code de poste à charger des modules compilés à partir de .dll ou .so fichiers. Si votre application permettra aux modules compilés, il est généralement préférable de créer un lien avec la bibliothèque partagée pour le cœur afin que les modules d'application et chargés puissent faire référence aux symboles à partir d'une seule instance de la bibliothèque principale. Notez que l'inclusion accidentelle de multiples instances du noyau Lua est presque garantie de produire des symptômes très difficiles à diagnostiquer.


0 commentaires