39 votes

Création d'exécutables Lua autonomes

Existe-t-il un moyen simple de créer des fichiers .exe autonomes à partir de scripts Lua ? En principe, il s'agirait de lier l'interpréteur Lua et les scripts.

Je crois que c'est possible (PLT Scheme permet de créer des exécutables autonomes de la même manière), mais comment, exactement ?

30voto

Augusto Radtke Points 2547

Vérifiez pour srlua . Il fait ce dont vous avez besoin.

C'est de l'un des auteurs de Lua. À cette adresse, il y a également des binaires Windows pré-compilés, ce qui serait encore plus facile pour vous, je pense.

0 votes

Malheureusement, srlua n'a pas fonctionné pour moi. La solution avec luac/bin2c ci-dessous a fonctionné.

1 votes

Srlua distribue des binaires dans son dépôt github. github.com/LuaDist/srlua Ça a bien marché pour moi. glue.exe srlua.exe my.lua my.exe

10voto

Pour faire un exécutable à partir de script utiliser l'utilitaire bin2c de cette façon :

luac script.lua -o script.luac
bin2c script.luac > code.c

Créez ensuite dans un éditeur de texte le fichier main.c et compilez-le/lienz-le avec votre compilateur préféré. C'est tout. (Note - l'exécutable supporte aussi les arguments de la ligne de commande)

Exemple avec MSVC :

cl /I "./" /I "$(LUA_DIR)\include" /D "_CRT_SECURE_NO_DEPRECATE" /D "_MBCS" /GF /FD /EHsc /MD /Gy /TC /c main.c
ld /SUBSYSTEM:CONSOLE /RELEASE /ENTRY:"mainCRTStartup" /MACHINE:X86 /MANIFEST $(LUA_DIR)\lib\lua5.1.lib main.obj /out:script.exe
mt -manifest $script.manifest -outputresource:script.exe;1

Utilisez /SUBSYSTEM:Windows pour l'exécutable GUI. Tout cela n'est pas facile juste pour la première fois, vous pouvez créer un fichier batch pour automatiser le processus une fois que vous l'avez essayé avec succès.

main.c :

#include <stdlib.h>
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main(int argc, char *argv[]) {
  int i;
  lua_State *L = luaL_newstate();
  luaL_openlibs(L);
  lua_newtable(L);
  for (i = 0; i < argc; i++) {
    lua_pushnumber(L, i);
    lua_pushstring(L, argv[i]);
    lua_rawset(L, -3);
  }
  lua_setglobal(L, "arg");
#include "code.c"
  lua_close(L);
  return 0;
}

2 votes

Notez que bin2c a été abandonné avec Lua 5.1, vous avez donc besoin d'un autre moyen d'empaqueter le bytecode et de le placer sur la pile Lua. Voir lua-users.org/wiki/BinToCee pour une réimplémentation en Lua.

7voto

Ignacio Points 790

Outre les suggestions ci-dessus, vous pouvez jeter un coup d'œil à L-Bia .

Il peut créer des exécutables autonomes comprenant des scripts lua et les bibliothèques dynamiques nécessaires.

5voto

polm23 Points 622

A partir de 2018, luastatique est un outil activement maintenu qui fait cela. srlua de la réponse acceptée et les autres outils sur cette page semblent ne pas être maintenus.

0 votes

Donc, existe-t-il un outil qui puisse 1. trouver tous les paquets et DLL nécessaires, puis les copier automatiquement ? 2. d'empaqueter les fichiers sources Lua dans un EXE, afin de protéger le code source à un niveau inférieur. Exactement comme ce que fait pyinstaller fait. Alors, un peu de douceur ? Merci de votre compréhension.

3voto

Puisque vous dites '.exe', je suppose que vous recherchez une solution Windows. Une idée consiste à ajouter des scripts à un interprète exécutable préconstruit. Cette solution peut ou non être qualifiée de "facile" selon vous.

L'interpréteur doit être capable de se lire lui-même, d'analyser son en-tête pour déterminer où se terminent les données .exe ordinaires (c'est-à-dire où commence le script), puis de transmettre le reste du fichier à Lua.

D'autres solutions ne demandent pas à l'interpréteur de travailler aussi dur, mais nécessitent une liaison plus complexe, alors qu'avec cette méthode, l'exetification d'un script peut être aussi simple que

copy interpreter.exe+script.lua script.exe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X