Как из lua сделать dll
есть ли простой способ создать автономный .exe-файлы из сценариев Lua? В основном это будет включать связывание интерпретатора Lua и скриптов.
Я считаю, что это возможно (схема PLT позволяет создавать автономные исполняемые файлы таким же образом), но как именно?
проверить srlua. Это то, что вам нужно.
Это от одного из авторов Lua. По этому адресу также есть предварительно скомпилированные двоичные файлы Windows, так что вам будет еще проще, я думаю.
чтобы сделать исполняемый файл из скрипта, используйте утилиту bin2c таким образом:
затем создайте в текстовом редакторе файл main.C и скомпилировать/связать его с вашим любимым компилятором. Вот и все. (Примечание - исполняемый файл также поддерживает args командной строки)
Use / SUBSYSTEM: Windows для исполняемого файла GUI. Все это непросто только в первый раз, вы можете создать пакетный файл для автоматизации процесса после успешной попытки он.
помимо вышеуказанных предложений, вы можете взглянуть на L-Bia.
Он может создавать автономные исполняемые файлы, включая сценарии lua и необходимые динамические библиотеки.
Так как вы говорите.exe " я предполагаю, что вы ищете решение для Windows. Одна из идей - просто добавить скрипты к предварительно созданному исполняемому файлу интерпретатора. Это может быть или не быть квалифицировано как "легко" в вашей книге.
интерпретатор должен уметь читать сам, анализировать его заголовок, чтобы определить, где обычный .данные exe заканчиваются (т. е. где начинается скрипт), а затем передать оставшуюся часть файла Lua.
другие решения не требуют, чтобы интерпретатор работал так же усердно, но требуется более сложная компоновка, тогда как с помощью этого метода exeifying скрипта может быть так же просто, как
поскольку эта тема имеет несколько "вечный" интерес, а возможные ответы "текучие" в том смысле, что могут появиться новые решения (в то время как старые могут устареть), вот еще одна возможность (для Windows) и чистые зависимости источника Lua.
Примечание: за исключением случаев, когда есть различия в байт-коде для других платформ результирующий код C должен быть способен компилироваться на любой платформе, которая может компилировать исходный код Lua, и создавать автономные собственные двоичные файлы ваших приложений Lua.
по состоянию на 2018 год,luastatic является активно поддерживаемым инструментом, который делает это. srlua из принятого ответа и других инструментов на этой странице, похоже, не поддерживается.
Взаимодействие происходит по стандартному алгоритму: в скрипте QLua(Lua) вызываются функции из подключенной при помощи директивы "require" библиотеки DLL, написанной на языке C/C++ (о том как ее создать, можно прочитать в данной статье). В функцию можно передавать данные, в виде параметров. Обрабатывать их внутри функции и получать в скрипт результат(ы) выполнения функции.
Для этого служит Lua-стек, который представляет из себя массив разнотипных данных (таблицу Lua). Первое значение, помещенное в стек, получает индекс 1, второе - 2 и т.д.
Для каждого отдельного вызова функции автоматически используется отдельный стек!
Получить результаты можно обычным способом, и, если их несколько, используя параллельное присваивание.
Пример, если бы функция из приведенного примера DLL возвращала 4 значения:
Для того, чтобы получить значения внутри функции DLL, переданные из скрипта, в Lua существует несколько функций, приведу основные:
Пример получения значений внутри функции C/C++ с предварительной проверкой на тип, переданных в примере выше:
Основные функции для добавления элементов в стек:
Пример с добавлением отправки полученных значений обратно в скрипт:
Скрипт, демонстрирующий работу данной функции:
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей .
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Взаимодействие Lua и библиотеки DLL, написанной на C/C++: 57 комментариев
Кто-нибудь использовал CLR или иные способы вывода форм из DLL? На данный момент пробую использовать CLR, но похоже, что из-за этого DLL после остановке LUA скрипта (где подключен DLL) - не выгружается.
dll с циклом всех победила.
Я, конечно, не знаю, насколько крут LuaJIT, но если крут, то он r из ваш цикла
вычислит на этапе JIT-компиляции, а если ещё круче -- отбросит как dead code.
Но, увы, в QUIK не LuaJIT, так что спекулировать об этом здесь нет смысла.
В первом случае, да -- скорее всего, накладные расходы на вызов нативной функции в цикле перевесили расходы на выполнение цикла в интерпретаторе.
Enfernuz,то есть мне для достижения максимальной скорости нужно в dll запихать всё, что сейчас находится в Луа-скрипте. Это позволит обратиться к dll единожды при вызове библиотеки. Вся логика робота будет в dll.
А если переносить в dll только часть функций, то Луа по скорости победит C++, потому что долгое взаимодействие Луа с dll. Я думаю, Вам об этом стоит задуматься лишь тогда, когда (если) Вы упрётесь в какой-нибудь боттлнек при реализации своих алгоритмов на Lua в QUIK.
Ну, или если просто владеете другим языком лучше , чем Lua :) Enfernuz,
уже уткнулся. Всё это происходит, потому что мои колбеки OnQuote захлёбываются.
Я принимаю 55 инструментов, и скрипт на луа не справляется.
В каждом колбеке есть логика и математика, которую нельзя переместить в main.
поэтому нужна скорость
Нет ничего такого, чего нельзя перенести в main поток. Значит вы логику нарушили
никаких тяжелых вычислений в колбеках. Просто аксиомой это установите и ведите разработку с этим учетом.
Аксиомы: Тяжелые вычисления в коллбэке = смерть квика
Для себя ничего особо полезного не увидел, очередное пособие как делать обертки, таких в инете на любой вкус. К ускорению взаимодействия с луа-движком этот путь не ведет.
позвольте Вам напомнить, что суть форума - обмен информацией. полезность и результативность сего процесса исключительно персонифицированы.Цитата |
---|
новичок написал: позвольте Вам напомнить, что суть форума - обмен информацией. полезность и результативность сего процесса исключительно персонифицированы. |
Никак не возражаю, наоборот вполне согласен. И позвольте в ответ отметить что я вполне конструктивно подкинул ссылку на русский вариант текста который многим может быть удобнее.
И далее не вижу по каким причинам я не могу высказать свое отношение к материалу. Возможно формулировка резковата, ну что делать, я считаю материал откровенно слабым. Могу это долго и нудно аргументировать. Пример с которого начинается статья по сути требует написания нескольких строк в конфиге любого формата. А не притягивания в проект сценарного движка. И так далее.
Все это исключительно мое личное мнение которое не отражает ничьей официальной позиции )))
You actually revealed it fantastically!erectile implants video
cheapest ed drugs
erectile transplant
ed drugs list
Подскажите, пожалуйста, какие накладываются ограничения в QLUA по сравнению с обычным LUA 5.1?
Имею в виду - кол-во local переменных, кол-во и размер пользовательских таблиц, кол-во модулей, размер модулей, и т.д.
Код стабилен. Если раскомментировать строку 'local test_tbl_ = <>' , QUIK рушится с exception'ом, либо сразу после вызова, либо при попытке завершения работы скрипта. Понятно, что сам по себе такой код
безвреден и крешиться не может, но программа разрослась, состоит уже из 8 модулей скучей функций и таблиц.
Отсюда и вопрос: каковы ограничения по сравнению с обычным LUA 5.1? Дело ещё в том, что на мной написанном имитаторе (Borland C++ 6.0 с/без Code Guard, LUA 5.1) тот же самый код стабилен.
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Loading
Copy raw contents
Copy raw contents
Приглагаемый код плагина можно скомпилировать примерно следующим образом из Developer Command Prompt (32-битного) от MSVS:
Более подробно инструкции даны в тексте этого документа.
Цель примера и приобретаемые навыки
- Создание с нуля "пустого" проекта QluaCpp
- Использование простейшей функции message Qlua
Для написания и запуска плагина понадобится ряд программ.
Торговый терминал Quik понадобится только для запуска плагина, написание кода и сборка возможна без него
Система контроля версий git понадобится для скачивания библиотек и их зависимостей. Установка другим способом находящихся под git библиотек данного проекта не рекомендуется, поскольку в их структуре используются подмодули, обеспечивая соответствие версий зависимостей.
Библиотека qluacpp является header-only библиотекой. Использование CMake не обязательно при использовании qluacpp, но для удобства сам пример будет разрабатываться с использованием CMake.
Для сборки этого примера потребуется NMake, входящий в состав Microsoft Visual Studio или Windows Development Tools. Сама IDE не потребуется, хотя будет показано, как сгенерировать проект Visual Studio из CMake. В примере использовалась Visual Studio 2017
Для написания кода и других файлов примера используется только текстовый редактор, что делает разработку независимой от среды. Можно использовать любой текстовый редактор: от Visual Studio, Notepad и т.п. При создании этого примера использовался Emacs.
Начальная структура проекта
На файловой системе проект плагина будет выглядеть следующим образом
../contrib - директория для сторонних библиотек, в том числе qluacpp. Обратите внимание, чтоб эта директория находится в корневой директории примеров (на один уровень выше директории этого примера).
src - исходные файлы нашего плагина
Создаем указанные выше директории, после чего помещаем наш проект под систему контроля версий git. Если используется совместимый со стандартным git, для этого открываем Command Prompt от Windows, заходим в директорию проекта и выполняем:
В дальнейшем подразумевается, что читатель будет по мере необходимости самостоятельно делать git commit
Установка сторонних библиотек
В директории contrib проекта для установки qluacpp исполняем команду:
Для обновления зависимостей подмодуля исполняем:
git submodule update --init --recursive
Скачивание нужной версии библиотеки
На момент написания данного документа максимальной версией в рамках ветви 5.1 является версия 5.1.5. Переходим в этот каталог, где далее выбираем Windows Libraries и Dynamic.
Выбираем архив, ближайщий к нашему сценарию использования. Например, на момент написания для Win32, dll, 14 = lua-5.1.5_Win32_dll14_lib.zip; для Win64, dll, 15 = lua-5.1.5_Win64_dll15_lib.zip
В директории contrib создаем директорию lua. Копируем туда содержимое скаченного оригинального архива с библиотекой Lua.
Создание CMake проекта
В директории проекта создаем файл CMakeLists.txt
В начале файла указываем:
Создаем переменные с путями к используемым в проекте библиотекам и их зависимостям:
Устанавлиаем переменные с указанием пути к файлам библиотеки lua. Для lib-файла делаем это через переменную LUA_LIBRARIES, настроив ее на путь к скаченному lib-файлу библиотеки Lua:
Указываем путь к загаловкам скаченной библиотеки Lua:
Перечисляем исходные файлы нашего плагина:
Указываем, что мы хотим создать DLL:
Указываем конфигурацию линковки (подсоединяем нужные библиотеки к компилируемой dll):
Пишем код плагина
Создание едиственного исходного файла примера
Создаем файл basic_tutorial.cpp в директории src и открываем его в редакторе.
Декларируем через директивы препроцессора, что мы создаем "библиотеку" Lua:
Подключаем заголовки из стандартной библиотеки для работы со временем и потоками (используются, чтоб делать паузу в функции main).
После этого подключаем библиотеку qluacpp:
Создаем пустую глобальную структуру для интерфейса наших "библиотечных" функций для Lua:
Создаем обработчик Lua-функции main:
Декларируем структуры Luacpp для обработчика main. Цифра "2" в конце имени макроса указывает количество параметров к макросу. Первый аргумент содержит имя функции внутри Lua, второй - имя соответствующей ей функции C++ в нашем коде:
Создаем видимую извне функцию с C ABI, которая будет инициализировать "библиотеку":
Внутри функции luaopen_lualib_basic_tutorial из указателя на структуру с состоянием Lua создаем объект интерфейса Lua с C++:
Наконец, подключаем нашу "библиотеку" к Lua:
В любом удобном месте, не внутри директории с репозитарием проекта, мы должны создать директории, в которые будет сгенерирован при помощи CMake проект под нужную нам среду.
В меню Start Windows ищем Command Prompt for VS2017. При выборе следует помнить, под какую разрядность системы компилируется проект. Поэтому, если компиляция происходит, например , на 64-битном Windows под 32-битный Quik, следует выбирать x64_x86 Cross Tools Command Prompt.
Компиляция проекта при помощи NMake
NMake - мейкер от Microsoft, который поставляется в составе Visual Studio, Windows Developer Tools и др.
Создаем директорию basic_tutorial_nmake
Заходим в нее и выполняем:
где последний аругмент - путь к коду проекта, а опция -G указывает, под какую среду генерировать проект.
В результате будет скомпилирован файл DLL нашего плагина, который можно использовать как Lua "библиотеку" в Quik.
Проект (solution) IDE Visual Studio
Cоздаем директорию basic_tutorial_vs. Заходим в нее и выполняем:
где последний аругмент - путь к коду проекта, а опция -G указывает, под какую среду генерировать проект. Для 64-битных целей компиляции следует указывать битность, например -G "Visual Studio 15 2017 Win64"
После этого в указанной директории будет создан проект Visual Studio нашего плагина. Описание дальнейшей работы с Visual Studio не является предметом данного документа.
Установка плагина в терминал Quik
Если в директории терминала Quik нет файла lua5.1.dll (прокси-библиотеки с интерфейсом Lua от Arqa), но есть lua51.dll, создаем копию файла lua51.dll и называем ее lua5.1.dll, для соответствия идентификаторам, используемым в родном файле lua5.1.lib из состава архива Lua, который мы скачивали на этапе установки библиотек.
Читайте также: