8 Stimmen

Lua in C++ einbetten

Ich möchte ein C++-Programm schreiben, das während der Ausführung mit Lua-Skripten interagieren bzw. diese aufrufen kann. Ein Schlüsselkonzept des Programms ist die vollständige Plattformunabhängigkeit, aber ich scheine nicht in der Lage zu sein, ein Lua-Build zu finden, das tatsächlich etwas bietet, das.

Die Lua-Builds, die ich bisher gefunden habe, basieren entweder auf Umgebungsvariablen oder speziellen Bibliotheken wie .lib , .dll ou .so . Der offizielle Lua-Quelltext von lua.org ist auch nicht das, wonach ich suche, da es eine Hauptfunktion definiert

Gibt es eine einfache - am besten wäre etwas wie sqlite-amalgamation - Lua-Interpreter für C/C++, die keine dieser Abhängigkeiten haben?

8voto

Chris Becke Punkte 32199

Lua.c enthält main und definiert den Einstiegspunkt für eine Konsolenanwendung. Wenn Sie es aus dem Projekt entfernen, wird das, was übrig bleibt, zu einer eigenständigen Lib, oder dynamischen Bibliothek, wenn Sie es bevorzugen, einfach gut.

0 Stimmen

Vielen Dank für Ihre Antwort! Gerade bemerkt, dass lua.c (Stand-alone-Interpreter) und luac.c (Lua-to-Bytecode-Compiler) enthalten eine Haupt - irgendwie seltsam, dass die Quelle nicht in verschiedenen Ordnern getrennt ist

0 Stimmen

@MFH, diese Organisation ist ziemlich typisch für klassische Makefile-basierte Projekte. Man beachte das allgemeine Alter von Lua. Das Makefile baut (abhängig von der Plattform) sowohl eine statische als auch eine dynamische Bibliothek aus dem Kern und kompiliert dann lua.c und luac.c, die mit ihnen verlinkt sind.

0 Stimmen

Aha, ehrlich gesagt, obwohl ich MAKEFILES ein bisschen benutzt habe, habe ich sie nie wirklich gemocht und ich habe die Anwendungen immer in verschiedene Ordner aufgeteilt

8voto

Bernd Elkemann Punkte 22855

Das Folgende verwende ich als Ausgangspunkt für meine Projekte (ich habe vor einiger Zeit etwas Ähnliches gefunden und es angepasst, damit ich es schneller ändern kann):


Die Lua-Skriptdatei:

    -- Start
    -- Script: myscript.lua
    print("this is lua")
    -- End

Die C-Datei:

    #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;
    }

Sie können diese frei als Grundlage für Ihre Projekte verwenden.

0 Stimmen

luaL_reg sollte sein luaL_Reg

4voto

RBerteig Punkte 39719

Für eine Zusammenführung des Lua-Kerns und des eigenständigen Interpreters in einer einzigen Datei, siehe die Datei etc/all.c im offiziellen Quellenset. Sie können es sicherlich als Grundlage für Ihre eigene Zusammenstellung verwenden, vielleicht indem Sie den Verweis auf lua.c in der letzten Zeile.

Viele größere Anwendungen, die Lua einbetten, tun dies, indem sie einfach die Kernquelldateien zum Projekt hinzufügen. Dies ist besonders effektiv, wenn die Anwendung nicht zulassen will, dass der Erweiterungscode kompilierte Module von .dll ou .so Dateien. Wenn Ihre Anwendung kompilierte Module zulässt, dann ist es in der Regel am besten, gegen die gemeinsam genutzte Bibliothek für den Kern zu linken, so dass die Anwendung und die geladenen Module die Symbole aus einer einzigen Instanz der Kernbibliothek referenzieren können. Beachten Sie, dass die versehentliche Einbindung mehrerer Instanzen des Lua-Kerns fast garantiert zu sehr schwer zu diagnostizierenden Symptomen führt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X