Lua: breve tutorial de integración con C++

Escrito por aserrano. Posteado en C++, Desarrollo, Juegos, Linux, Lua

Para poder acelerar y mejorar los tiempos de desarrollo de tu aplicación C++ tienes la posibilidad de integrar algún lenguaje de script en la misma.

Vamos por tanto a ver un breve tutorial de integración Lua, un lenguaje de script con una sintáxis bastante similar a C, y C++.

El método más directo es usar luabind, una librería que nos va a permitir dicha integración de una manera rápida y sin grandes dolores de cabeza.

Comentar que el tutorial ha sido desarrollado en Ubuntu 9.04. Ubuntu 9.04 viene con el paquete luabind versión 0.7 que es incompatible con lua 5.1, por tanto, deberemos descargar la última versión que a día de hoy es la 0.8.1 y compilarla.

Bajamos la última versión de luabind de aquí.

Luabind necesita de las librerías boost. Procedemos a instalarla:

sudo apt-get install libboost1.35-dev
 
sudo apt-get install boost-build

Si no estuviera instalada la herramienta de compilación bjam:

sudo apt-get install bjam

Descomprimimos el paquete de luabind y lo compilamos:

cd luabind-0.8.1
 
bjam
 
sudo bjam install

Luabind nos permite integrar en lua, casi de de forma integra cualquier elemento del lenguaje C++: clases, funciones, operadores, variables, etc.

Veamos como llamar una función desde un script LUA.

Incluimos las cabeceras de lua de la siguiente forma y definimos la función que formará parte de la librería:

extern "C" {
 
#include <lua5.1/lua.h>
 
}
 
#include <stdio.h>
 
#include <luabind/luabind.hpp>
 
void sayHelloWorld()
 
{
 
printf("Hello Worldn");
}

Añadimos también la función de inicialización de la librería:

extern "C" int init(lua_State* L)
{
using namespace luabind;
 
open(L);
 
module(L)
[
def("sayHelloWorld", &amp;amp;amp;amp;amp;amp;sayHelloWorld)
];
 
return 0;
}

Compilamos la librería:

gcc -I/usr/local/include -I/usr/include/lua5.1 -shared -fPIC -o sayhello.so sayhello.cpp -lluabindd -llua5.1

Ya sólo nos quedaría crear un programa en lua para usarlo. Mediante la función “loadlib” cargamos la librería y la inicializamos con la función C que hemos creado “init”:

package.loadlib('./sayhello.so','init')
 
sayHelloWorld()

De forma análoga podríamos definir clases, estructuras, funciones, operadores sobrecargados, etc.

Veamos un ejemplo más complejo que refleja una clase, un operador de suma y una función para obtener el total:

#include <luabind/luabind.hpp>
#include <luabind/operator.hpp>
 
class Prueba
{
int totalPrice;
public:
 
Prueba() {}
Prueba(int nume)
{
totalPrice=nume;
}
Prueba operator+(Prueba op2);
 
int getTotal() { return totalPrice; }
};
 
Prueba Prueba::operator+(Prueba op2)
{
Prueba temp;
 
temp.totalPrice=totalPrice+op2.totalPrice;
 
return temp;
}
 
extern "C" int init(lua_State* L)
{
 
using namespace luabind;
 
open(L);
module(L)
[
class_<Prueba>("Prueba")
.def(constructor<const int>())
.def("getTotal",&amp;amp;amp;amp;amp;Prueba::getTotal)
.def(self + other<Prueba>())
];
return 0;
}

Ya sólo nos queda ejecutarlo con Lua:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
package.loadlib("./prueba.so","init")()
 
a=Prueba(12)
b=Prueba(23)
c=a+b
print(c:getTotal())
35

Etiquetas:, , ,

"Trackback" Enlace desde tu web.

Deja un comentario

Time limit is exhausted. Please reload CAPTCHA.

Nota legal

(C) Antonio Serrano 2012