Exécution du fichier object luajit à partir de C

De la documentation: http://luajit.org/running.html

luajit -b test.lua test.obj # Generate object file # Link test.obj with your application and load it with require("test") 

Mais n’explique pas comment faire ces choses. Je suppose qu’ils supposent que quiconque utilise Lua est aussi un programmeur C, pas le cas avec moi! Puis-je avoir de l’aide? GCC à titre d’exemple.

Je voudrais aussi faire la même chose excepté l’en-tête de tableau d’octets de C. Je ne trouve pas de documentation à ce sujet non plus.

 luajit -bt h -n test test.lua test.h 

Cela crée le fichier d’en-tête mais je ne sais pas comment l’exécuter à partir de C. Merci.

    main.lua

     print("Hello from main.lua") 

    app.c

     #include  #include "lua.h" #include "lauxlib.h" #include "lualib.h" int main(int argc, char **argv) { int status; lua_State *L = luaL_newstate(); luaL_openlibs(L); lua_getglobal(L, "require"); lua_pushliteral(L, "main"); status = lua_pcall(L, 1, 0, 0); if (status) { fprintf(stderr, "Error: %s\n", lua_tossortingng(L, -1)); return 1; } return 0; } 

    Commandes Shell:

     luajit -b main.lua main.o gcc -O2 -Wall -Wl,-E -o app app.c main.o -Ixx -Lxx -lluajit-5.1 -lm -ldl 

    Remplacez -Ixx et -Lxx par les répertoires d’inclusion et de bibliothèque LuaJIT. Si vous l’avez installé dans /usr/local (par défaut), la plupart des installations GCC le trouveront sans ces deux options.

    La première commande comstack le code source Lua en bytecode et l’intègre dans le fichier object main.o

    La deuxième commande comstack et lie le code minimal de l’application C. Notez qu’il lie également le bytecode incorporé. Les -Wl,-E sont obligatoires (sous Linux) pour exporter tous les symboles de l’exécutable.

    Maintenant, déplacez le main.lua original (pour vous assurer qu’il exécute vraiment le bytecode incorporé et non le fichier de code source Lua), puis exécutez votre application:

     mv main.lua main.lua.orig ./app # Output: Hello from main.lua 

    L’utilisation de base est la suivante:

    • Générez le fichier d’en-tête à l’aide de luajit
    • #include cet en-tête dans le (s) fichier (s) source (s) qui référencera ses symboles
    • Comstackz la source dans un exécutable exécutable ou un module binary partagé pour lua en fonction de votre cas d’utilisation.

    Voici un exemple minimal pour illustrer:

    test.lua

     return { fooprint = function (s) return print("from foo: "..s) end, barprint = function (s) return print("from bar: "..s) end } 

    test.h

     // luajit -b test.lua test.h #define luaJIT_BC_test_SIZE 155 static const char luaJIT_BC_test[] = { 27,76,74,1,2,44,0,1,4,0,2,0,5,52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15, 102,114,111,109,32,102,111,111,58,32,10,112,114,105,110,116,44,0,1,4,0,2,0,5, 52,1,0,0,37,2,1,0,16,3,0,0,36,2,3,2,64,1,2,0,15,102,114,111,109,32,98,97,114, 58,32,10,112,114,105,110,116,58,3,0,2,0,5,0,7,51,0,1,0,49,1,0,0,58,1,2,0,49,1, 3,0,58,1,4,0,48,0,0,128,72,0,2,0,13,98,97,114,112,114,105,110,116,0,13,102, 111,111,112,114,105,110,116,1,0,0,0,0 }; 

    runtest.cpp

     // g++ -Wall -pedantic -g runtest.cpp -o runtest.exe -llua51 #include  #include  #include "lua.hpp" #include "test.h" static const char *runtest = "test = require 'test'\n" "test.fooprint('it works!')\n" "test.barprint('it works!')\n"; int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); // package, preload, luaJIT_BC_test bool err = luaL_loadbuffer(L, luaJIT_BC_test, luaJIT_BC_test_SIZE, NULL); assert(!err); // package.preload.test = luaJIT_BC_test lua_setfield(L, -2, "test"); // check that 'test' lib is now available; run the embedded test script lua_settop(L, 0); err = luaL_dossortingng(L, runtest); assert(!err); lua_close(L); } 

    C’est assez simple. Cet exemple prend le code d’octet et le place dans la table package.preload pour l’environnement lua de ce programme. Les autres scripts lua peuvent alors utiliser ceci en require 'test' . La source lua intégrée dans runtest fait exactement cela et runtest :

     from foo: it works! from bar: it works!