Создание автономных исполняемых файлов Lua

Есть ли простой способ создать автономные файлы .exe из сценариев Lua? В основном это будет связано с связыванием интерпретатора Lua и скриптов.

Я считаю, что это возможно (схема PLT позволяет таким же образом создавать автономные исполняемые файлы), но как именно?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
38
0
45 043
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Поскольку вы говорите ".exe", я предполагаю, что вы ищете решение для Windows. Одна из идей - просто добавить сценарии к готовому исполняемому файлу интерпретатора. Это может или не может квалифицироваться как «легкий» в вашей книге.

Интерпретатор должен иметь возможность читать сам себя, анализировать свой заголовок, чтобы определить, где заканчиваются обычные данные .exe (т.е. где начинается сценарий), а затем передать оставшуюся часть файла Lua.

Другие решения не требуют, чтобы интерпретатор работал так усердно, но требуют более сложного связывания, тогда как с этим методом выполнение сценария может быть таким же простым, как

copy interpreter.exe+script.lua script.exe
Ответ принят как подходящий

Проверьте шрлуа. Он делает то, что вам нужно.

Это от одного из авторов Lua. По этому адресу есть также предварительно скомпилированные двоичные файлы Windows, так что, я думаю, вам будет еще проще.

К сожалению, srlua у меня не сработал. Решение с luac / bin2c, приведенное ниже, работало.

Zane 11.01.2013 14:54

srlua распространяет двоичные файлы в своем репозитории на github - github.com/LuaDist/srlua У меня они работали очень хорошо - glue.exe srlua.exe my.lua my.exe

noahp 29.05.2015 18:55

Помимо приведенных выше предложений, вы можете взглянуть на L-Bia.

Он может создавать автономные исполняемые файлы, включая сценарии lua и необходимые динамические библиотеки.

Чтобы сделать исполняемый файл из скрипта, воспользуйтесь утилитой bin2c таким образом:

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

Затем создайте в текстовом редакторе файл main.c и скомпилируйте / свяжите его с вашим любимым компилятором. Вот и все. (Примечание - исполняемый файл также поддерживает аргументы командной строки)

Пример с 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

Используйте / SUBSYSTEM: WINDOWS для исполняемого файла GUI. Все это непросто только в первый раз, вы можете создать командный файл для автоматизации процесса, как только вы его успешно попробуете.

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

Обратите внимание, что bin2c был удален с Lua 5.1, поэтому вам нужен другой способ упаковать байт-код и поместить его в стек Lua. См. lua-users.org/wiki/BinToCee для повторной реализации в Lua.

Charles Stewart 07.02.2014 14:35

Поскольку у этой темы есть несколько «постоянный» интерес, а возможные ответы «текучие» в том смысле, что могут появиться новые решения (в то время как старые могут стать устаревшими), вот еще одна возможность (для Windows) и чисто исходные зависимости Lua.

Ссылка: Консольная утилита Windows для преобразования исходного кода Lua с его зависимостями исходного кода Lua в файл C, готовый для компиляции, за один шаг.

Примечание. За исключением случаев, когда существуют различия в байт-коде для других платформ, полученный код C должен иметь возможность компилироваться на любой платформе, которая может компилировать исходный код Lua и создавать автономные собственные двоичные файлы ваших приложений Lua.

По состоянию на 2018 год луастатический является активно поддерживаемым инструментом, который делает это. srlua из принятого ответа, а другие инструменты на этой странице, похоже, не поддерживаются.

Итак, есть ли какой-нибудь инструмент, который может 1. найти все необходимые пакеты и библиотеки DLL, а затем автоматически их все скопировать? 2. упаковать исходные файлы Lua в EXE, чтобы обеспечить низкоуровневую защиту исходного кода. Точно так же, как pyinstaller. Так какой софт? Спасибо

oyster 23.07.2019 18:34

Другие вопросы по теме