Создание игр » Featured, Scripting » LuaBind
LuaBind
LuaBind это ООП-обёртка для луа. О самом языке Луа я уже рассказывал вам в уроке про Луа и уроке Установка Lua. Как говорят сами авторы luabind, он задуман как помощник при биндиге C/C++ функций в Lua и наоборот. Кроме того, он добавляет возможность шарить в луа классы и использовать их, включая виртуальные функции. Полезная штука. Использовать Lua через LuaBind становится намного проще. Хотя, ООП’шные и шаблонные навороты luabind, конечно, немного усложняют понимание на первых порах. Однако, я попробую хотя бы отчасти упростить задачу понимания всех тонкостей использования luabind и дать вам хотя бы понятия об основах его использования.
Установка luabind
Скачать luabind можно
Скачайте последнюю версию ( на данный момент версия 0.9.1 ) и разархивируйте её в отдельную папку. Ставить луабинд следует так же с использованием bjam (boost-build), но лично у меня это ни разу не получилось. Потому привожу алгоритм как оно работает, а не как надо )))
- Запускаяем Visual C++
- Создаём новый win32-проект, siatic library
- Указываем ему не использовать precomplied headers
- Добавляем в проект все файлы (cpp и хидеры) из папок src, luabind и luabind/detail
- В настройках проекта, в С++, добавьте директорию инклюдов, указав корневую папку luabind
- В линковщике укажите желаемые имена библиотеки для Release и Debug версий (я указал luabind.lib и luabind-debug.lib)
- Скомпилируйте обе версии (релиз и дебаг). Ошибок быть не должно.
Добавляем папки в релиз- и дебаг- версиями библиотек в либы Visual Studio, а так же добавляем корневую папку луабинд в инклюды студии. LuaBind готов к использованию. Давайте проверим.
Проверка работы LuaBind
Напишем небольшую тестовую программу для проверки работоспособности luabind:
#include "stdafx.h" #include <conio.h> #include <iostream> #include <luabind\luabind.hpp> #ifndef _DEBUG #pragma comment(lib, "lua.lib") // либа самого луа #pragma comment(lib, "luabind.lib") // либа луабинд #else #pragma comment(lib, "lua-debug.lib") // либа самого луа #pragma comment(lib, "luabind-debug.lib") // либа луабинд #endif using namespace std; int _tmain(int argc, _TCHAR* argv[]) { // Create a new lua state lua_State *myLuaState = lua_open(); // Connect LuaBind to this lua state luabind::open(myLuaState); // Define a lua function that we can call luaL_dostring( myLuaState, "function add(first, second)\n" " return first + second\n" "end\n" ); cout << "Result: " << luabind::call_function<int>(myLuaState, "add", 2, 3) << endl; lua_close(myLuaState); _getch(); } |
Запускам. Всё работает. Луабинд проверен и готов к использованию!
Если у вас что-то не получилось – напишите в комментариях, я попробую помочь вам!
Привет! Кое-что и правда не получилось.
Собрал статические либы luabind.lib (release) и luabind-debug.lib (debug) в точности по инструкции, но тестовый пример отказывается собираться с release – версией библиотеки. С дебаг-версией работает. Размеры библиотек получились такие:
luabind.lib 14,7 mb
luabind-debug.lib 5 mb
А лог при компиляции тестового проекта с luabind.lib выдаёт такой:
(извиняюсь, что мусорю)
1>—— Build started: Project: luabind_test, Configuration: Debug Win32 ——
1> lua.lib(lstate.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
1>LINK : warning LNK4075: ignoring ‘/INCREMENTAL’ due to ‘/LTCG’ specification
1>luabind.lib(open.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(pcall.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(inheritance.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(class_registry.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(class_rep.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(create_class.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(error.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>luabind.lib(object_rep.obj) : error LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ in main.obj
1>LINK : warning LNK4098: defaultlib ‘MSVCRT’ conflicts with use of other libs; use /NODEFAULTLIB:library
1>c:\visual studio 2010\Projects\luabind_test\Debug\luabind_test.exe : fatal error LNK1319: 8 mismatches detected
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
»crosslinked«
Antony, немного поправил исходный код примера (прагмы подключения библиотек). Попробуйте этот вариант, пожалуйста.
Теперь всё прекрасно работает, спасибо!
Моя вина – я просто в debug сборке проекта менял библиотеку luabind на релизную, надо было же и проект тоже собирать release.
Приношу извинения за кипиш.
Не проблема. В первую очередь я сам недосмотрел – надо было догадаться сразу использовать дефайны, во избежание любых проблем ) Рад, что смог помочь )
Вячеслав, во-первых хочу поблагодарить за Вашу работу!
При подключении #include
компилятор ругается на inheritance.hpp причем, как мне кажется, на ровном месте
35 std::pair cast(
36 void* p, class_id src, class_id target
37 , class_id dynamic_id, void const* dynamic_ptr) const;
1>luabind/detail/inheritance.hpp(37): error C2059: синтаксическая ошибка: (
1>luabind/detail/inheritance.hpp(37): error C2091: функция возвращает функцию
1>luabind/detail/inheritance.hpp(37): error C4430: отсутствует спецификатор типа – предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>luabind/detail/inheritance.hpp(37): fatal error C1903: не удается восстановить после предыдущих ошибок; остановка компиляции
Виталий, спасибо
Какой компилятор и какая его версия?
Какие версии буста/луабинда используете?
Инклюдите какой файл?
MS VC++ express 10.0.30309
BOOST 1_44_0
LUABIND 0.9.1
инклудю luabind\luabind.hpp (его с кавычками движок форума убрал видимо и оставил только #include)
Работает !!!!!!!!!!!!!!!!!!!!!!
Das ist Fantstic!!!!!!!!!!
Если бы ещё найти где-нибудь более менее вразумительное руководство (в смысле полное) Но это я так понял непозволительная роскошь. Или кто может подсказать где достать доку(очень желательно на русском)? ПЛС!!!!
Небольшое уточнение по пункту 5 сборки луабинд:
5а – В настройках проекта, в С++, добавьте директорию инклюдов, указав корневую папку boost
5б – В настройках проекта, в С++, добавьте директорию инклюдов, указав папку include из LUA
Кроме того в настройках тестового проекта надо не забыть указать путь к либам луа и луабинд.
И наконец замечание для тех кто самостоятельно не собирал луа, а воспользовался вариантом установки Lua for Windows изhttp://www.lua.org/download.html :
в предлогаемом примере надо поставить не lua.lib, а имя библиотеки которая установится при инсталяции (у меня, например, lua5.1.lib)
В остальном никаких проблем! Спасибо Вячеславу за последовательное объяснение. Сколько не пытался установить луабинд – не получалось, пока не прочёл этот урок