Уроки Коммент.

Создание игр » Featured, Scripting » LuaBind

LuaBind

luabindLuaBind это ООП-обёртка для луа. О самом языке Луа я уже рассказывал вам в уроке про Луа и уроке Установка Lua. Как говорят сами авторы luabind, он задуман как помощник при биндиге C/C++ функций в Lua и наоборот. Кроме того, он добавляет возможность шарить в луа классы и использовать их, включая виртуальные функции. Полезная штука. Использовать Lua через LuaBind становится намного проще. Хотя, ООП’шные и шаблонные навороты luabind, конечно, немного усложняют понимание на первых порах. Однако, я попробую хотя бы отчасти упростить задачу понимания всех тонкостей использования luabind и дать вам хотя бы понятия об основах его использования.

Установка luabind

Скачать luabind можно на сайте разработчика в разделе “Download”. Там же можно найти и документацию по luabind.

Скачайте последнюю версию ( на данный момент версия 0.9.1 ) и разархивируйте её в отдельную папку. Ставить луабинд следует так же с использованием bjam (boost-build), но лично у меня это ни разу не получилось. Потому привожу алгоритм как оно работает, а не как надо )))

  1. Запускаяем Visual C++
  2. Создаём новый win32-проект, siatic library
  3. Указываем ему не использовать precomplied headers
  4. Добавляем в проект все файлы (cpp и хидеры) из папок src, luabind и luabind/detail
  5. В настройках проекта, в С++, добавьте директорию инклюдов, указав корневую папку luabind
  6. В линковщике укажите желаемые имена библиотеки для Release и Debug версий (я указал luabind.lib и luabind-debug.lib)
  7. Скомпилируйте обе версии (релиз и дебаг). Ошибок быть не должно.

Добавляем папки в релиз- и дебаг- версиями библиотек в либы 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();
}

Запускам. Всё работает. Луабинд проверен и готов к использованию!

Если у вас что-то не получилось – напишите в комментариях, я попробую помочь вам!

Ещё по этой теме:




Раздел: Featured, Scripting · Теги: Lua

10 комментариев на "LuaBind"
  1. Antony пишет:

    Привет! Кое-что и правда не получилось.
    Собрал статические либы 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«

    1. Вячеслав пишет:

      Antony, немного поправил исходный код примера (прагмы подключения библиотек). Попробуйте этот вариант, пожалуйста.

  2. Antony пишет:

    Теперь всё прекрасно работает, спасибо!
    Моя вина – я просто в debug сборке проекта менял библиотеку luabind на релизную, надо было же и проект тоже собирать release.
    Приношу извинения за кипиш.

    1. Вячеслав пишет:

      Не проблема. В первую очередь я сам недосмотрел – надо было догадаться сразу использовать дефайны, во избежание любых проблем ) Рад, что смог помочь )

  3. Виталий пишет:

    Вячеслав, во-первых хочу поблагодарить за Вашу работу!
    При подключении #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: не удается восстановить после предыдущих ошибок; остановка компиляции

    1. Вячеслав пишет:

      Виталий, спасибо 8-)

      Какой компилятор и какая его версия?
      Какие версии буста/луабинда используете?
      Инклюдите какой файл?

      1. Виталий пишет:

        MS VC++ express 10.0.30309
        BOOST 1_44_0
        LUABIND 0.9.1
        инклудю luabind\luabind.hpp (его с кавычками движок форума убрал видимо и оставил только #include)

  4. Yar пишет:

    Работает !!!!!!!!!!!!!!!!!!!!!!
    Das ist Fantstic!!!!!!!!!!

  5. Yar пишет:

    Если бы ещё найти где-нибудь более менее вразумительное руководство (в смысле полное) Но это я так понял непозволительная роскошь. Или кто может подсказать где достать доку(очень желательно на русском)? ПЛС!!!!

  6. Yar пишет:

    Небольшое уточнение по пункту 5 сборки луабинд:
    5а – В настройках проекта, в С++, добавьте директорию инклюдов, указав корневую папку boost
    5б – В настройках проекта, в С++, добавьте директорию инклюдов, указав папку include из LUA

    Кроме того в настройках тестового проекта надо не забыть указать путь к либам луа и луабинд.

    И наконец замечание для тех кто самостоятельно не собирал луа, а воспользовался вариантом установки Lua for Windows из http://www.lua.org/download.html :
    в предлогаемом примере надо поставить не lua.lib, а имя библиотеки которая установится при инсталяции (у меня, например, lua5.1.lib)

    В остальном никаких проблем! Спасибо Вячеславу за последовательное объяснение. Сколько не пытался установить луабинд – не получалось, пока не прочёл этот урок :)

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>