Как собрать и связать ядро ​​Lua и несколько модулей Lua в одном файле .exe - PullRequest
8 голосов
/ 12 ноября 2011

Мне нужно сделать переносимое приложение, которое будет работать на Windows, Linux, MacOS и не требует установки.Это должен быть один исполняемый файл и никаких других библиотечных файлов (.dll, .so ...).Я буду использовать ANSI C и перекомпилировать проект для каждой платформы.Я хочу использовать скрипты Lua, поэтому я должен встроить интерпретатор Lua в мой код.Мне нужны сетевые и некоторые другие модули для написания, но я теперь, когда у Lua уже есть модули для этой цели, поэтому я буду использовать их вместо того, чтобы писать свои собственные.Как я могу связать все это вместе, интерпретатор Lua, модули Lua (т.е. LuaSocks) в одном исполняемом файле, который будет загружать скрипт .lua.У Lua есть система «require», которая ожидает, что найдет .dll, поэтому мне интересно, что мне делать, достаточно ли просто вызывать функции без оператора «require».

Ответы [ 2 ]

10 голосов
/ 12 ноября 2011

Вы, безусловно, можете сделать это (и это не так!), Хотя это не тривиально.Ядро Lua предназначено для встраивания, так что вы можете просто включить источники Lua в свой собственный проект, и оно «просто работает» :).

Сделка немного отличается отмодули - не многие из них подходят для прямого встраивания.Например, это было успешно опробовано для LuaSocket ранее, а также задано здесь .Основная идея заключается в том, чтобы встроить источники MODULE в ваш проект и вставить функцию luaopen_MODULE в package.preload['MODULE'], чтобы require мог забрать ее позже.

Один из способов - посмотреть наисточники проектов, в которые уже встроены Lua и другие библиотеки, такие как LÖVE , MurgaLua и Scrupp .

Если цель - не иметь ни одногоИсполняемый файл без внешних библиотек оказывается недостижимым, вы можете немного ослабить его и перейти на portable приложение - приложение, которое переносит все свои зависимости с ним в одном каталоге, независимо от системы.Для этого и был разработан LuaDist - вы используете его, как и LuaRocks, для установки пакетов Lua.Разница в том, что эти пакеты могут быть установлены / развернуты в отдельном каталоге, где также установлены все необходимые зависимости.Этот каталог («dist») полностью независим, то есть вы можете переместить его куда-нибудь еще, и он все равно будет работать.

Кроме того, мне не нравится идея приложения, которое требует установки (потому что это помещает файлы вокруг моей системы) - удаление должно быть просто удалением каталога:)

0 голосов
/ 12 ноября 2011

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

Единственный способ иметь «независимую» систему от системы и машины - по сути, нацелить ее на какую-то одну общую «виртуальную машину» (в широком смысле). В вашем случае это виртуальная машина Lua (это может быть виртуальная машина Java для других и т. Д.). Но вы должны предположить, что он есть у вашего пользователя, или предоставить тот, который зависит от машины и системы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...