Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ [C/C++] Пример плагина для Lua.

Автор: Cockney 21.9.2017, 21:57

Код элементарен. Хорошие примеры работы с API LUA можно найти в сорцах модуля math и др. , который поставляются с исходниками Lua. Особо не разобрался, т.к. протестировать нормально не могу, но вроде можно таким делом биндить классы из длл и другие фичи.

Сам собирал под VS 2017 CE. Кто сможет собрать и завести всю эту кухню - отпишите результат.



For GCC - Прикрепленный файл  gcc_ex.zip ( 1,91 килобайт ) Кол-во скачиваний: 694

For MSVC - Прикрепленный файл  PlugEx.zip ( 27,47 килобайт ) Кол-во скачиваний: 726

Автор: Cockney 21.9.2017, 22:21

И да, в приоритете, если возможно - делайте сборку через gcc компилятор, т.к. он в отличие от студии не привязывает код к версии винды + не надо ставить редисты и т.д.

Автор: Cockney 11.2.2018, 14:59

Обновил сорцы. Теперь собирается нормально. Добавил пару примеров функций.

Автор: Cockney 6.2.2019, 13:54

Год медитаций позволил мне наконец-то собрать плагин под gcc.

Сорцы плагина в шапке.


1)Ставим MSYS2 (именно MSYS2, не MSYS) по https://librebay.blogspot.com/2018/12/install-msys2-for-windows.html

2)Выполняем:

Код

pacman -S mingw-w64-i686-gcc
pacman -S make

Закрываем msys.

Дальнейшая работа идем относительно корня установки msys.

3)Качаем исходники Lua.

4)Кидаем в папочку /home/<User>/lua-src

5)Запускаем mingw32 из папки msys.

6)Выполняем:
Код

cd /home/<User>/lua-src
make mingw
make install INSTALL_TOP=/home/<User>/lua


Lua установлен локально, чтобы не засорять окружение. Окошко не закрываем.

7)Качаем сорцы плагина.

8)Копируем все в папочку /home/<User>/plugin

9)Открываем Makefile и правим под себя пути в "Lua settings"

10)Выполняем:
Код
    
cd /home/<User>/plugin
make


или

Код

make build


для автоочистки от мусора.


11) Enjoy !

Автор: DarkMaster 6.2.2019, 14:05

Первый раз вижу нормальный ман по сброке в MSYS/Mingw.

Тем не менее хочу обратить внимание, что если идет разработка/сборка под пилот/luajit, то luajit.org рекомендует не использовать стандартный api lua для работы с плагинами. Они рекомендуют использовать ffi. Из плюсов:
1) Нет необходимости в модификации dll. Может быть подключена уже существующая dll.
2) Скорость работы.
Из минусов... хз минус ли, по мне скорее плюс, но тем не менее необходимо будет создать и описать в lua типы данных которые необходимо передать/принять. Т.е. это полуавтоматическое создание биндингов.

MSYS2 нельзя ставить в песочницу - будьте внимательны. Будут сыпать ошибки named pipe поддержки, так же pacman не будет видеть уже установленные пакеты, а при попытке их установить будут происходить ошибки.

Автор: Cockney 6.2.2019, 14:12

Цитата
1) Нет необходимости в модификации dll. Может быть подключена уже существующая dll.


Какая dll и к чему подключается ? Если dll вообще любая хоть из winapi подключается к luajit - то да. Если dll изначально написана под api lua то она подключится как к обычному lua, так и к jit. Проверенно на 2.41.

Автор: DarkMaster 6.2.2019, 14:19

Цитата
Какая dll и к чему подключается ? Если dll вообще любая хоть из winapi подключается к luajit - то да.

winapi биндинги через ffi уже созданы.
https://luapower.com/winapi

Автор: Cockney 6.2.2019, 14:22

Цитата
2) Скорость работы.



Спорное утверждение. dll уже работает на максимальной скорости, а оптимизацию "ввода/вывода" через api никто не отменял.

В целом - мне не особо интересна кухня всех ffi и прочего. Я дал платформу. Вкручивайте что хотите. Что лучше/хуже смотрите сами.

Автор: DarkMaster 6.2.2019, 22:03

Цитата
Я дал платформу.

За что тебе безусловно спасибо. thanks.gif
Я просто сообщил о вариантах, которые имхо имеют право жить и опять же имхо уместно об этом здесь было написать. Если хочешь - почищу.

Автор: Cockney 6.2.2019, 23:24

Ни в коем случае.

Автор: Cockney 18.2.2019, 13:29

Пишу как заметку для себя, но мало-ли кому пригодится в случае возникновения вопросов о странностях сборки с этим чудом.


Компилятор можно(я бы предпочел) ставить не из оболочки msys, а из https://sourceforge.net/projects/mingw-w64/files/.

Запускаем. Выбираем самую свежую версию.

Дальше вариантов выбора опций много и все они влияют на дальнейшее удовольствие работы с компилятором.

Если архитектура i686(x32), то можно выбрать 2 модели исключений : dwarf, sjlj
Если архитектура x86_64(x64), то можно выбрать уже seh и sjlj

Что это такое (справедливо для C++, не C):

1)dwarf - обработка исключений не в стиле винды. Если произойдет эксепшен в какой-то сторонней длл(собранной msvc, например), то из своей мы его не поймаем. Чуть лучше sjlj по скорости. В целом не рекомендуется.

2)sjlj - работает везде как часы. срезает 20% скорости кода.

3)seh - родной способ для винды. Работает только под x64 => создать dll плагин для пилота невозможно. Для остального софта - пожалуйста.

Что из этого следует :

1)Выбрать sjlj - компилятор становится двухцелевым, т.е. на машине х32 можно собрать бинарник для х64 и наоборот, но при этом теряем 20% скорости используя С++(потери будут и при сборках x32->x32, x64->x64).

2)Выбрать seh - можем собирать только х64 бинарники без минуса к скорости и взаимодействия с пилотом.

3)Собирать по старинке MSVC - все работает быстро на seh, но идет привязка к версии винды.

4)Не использовать C++ вообще (only gcc). Быстро, модно, молодежно. Нет всех плюсов C++.

Threads можно выбрать что угодно. Я пока не нашел отличий, да и не искал.

После установки из папки взять mingw64 и закинуть в папку с msys2(удалить в ней перед этим mingw64).

Автор: rinat84 7.3.2019, 3:20

biggrin.gif то чувство когда собираешь из исходников 3 день ковыряю пытаюсь избавится от спама ident
Прикрепленное изображение

Автор: Cockney 27.3.2019, 21:58

Успешно собран luasocket под mingw.

Работает ?




Прикрепленные файлы
Прикрепленный файл  lua.zip ( 53,55 килобайт ) Кол-во скачиваний: 495

Автор: DarkMaster 22.1.2020, 18:33

Кхм... Даж стыдно как-то стало, что не отписался. В общем этот сокет давно в работе и от него проблем и нареканий нет/почти нет.
Были какие-то не до конца мне понятные подвисания прослушивания порта. Т.е. даже когда выключаешь пилот, то порт остается занятым и лечится исключительно ребутом. Тем не менее данная проблема наблюдалась и на старом сокете. Подозреваю, что лечится через установку settimeout на сервере, т.к. проблемы возникали исключительно при некорректном обрыве связи. В остальном вылечен огромный ворох багов и шуршит просто шикарно. Весь год как часы =)

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)