Hola, este es un tutorial de como integrar Lua en C++ usando swig que es un programa que hace el port de C++ a código reconocible por Lua.
http://www.swig.org/Doc1.3/Lua.html#Lua_nn7.
Al principio tiene el ejemplo de una aplicación que llama al interprete y sin embargo tiene cargado un módulo que es el código en C++ ya traducido en llamadas a la biblioteca de lua para realizar todo. por lo que si compilas ese ejemplo te va a decir que no se puede linkear esa función. Esto es por que existen dos formas de hacer lo que quieres, una es creando el módulo e incluirlo en un programa que va a ser el que incluya el módulo y el interprete. la otra es hacer como dice en la guia una biblioteca dinámica en los dos casos se tiene que usar swig para hacer el port todos los archivos se incluyen para ser compilados junto con el código que arroja el swig, con esto se crea un biblioteca dinámica que puede ser llamada desde un programa en C++, en este caso no se usa el interprete, pero la misma biblioteca puedes usarla abriendo el interprete de lua y llamando a la biblioteca dinámica, este es un ejemplo de un programa que hice:
- Código: Seleccionar todo
#!/usr/bin/lua
require("libtank_war")
g=libtank_war.game();
g:init_video(800,600,32);
--a=libtank_war.audio();
--a:add_chunk("../sounds/disp.wav");
--a:add_chunk("../sounds/disp_mis.wav");
--a:add_audio("../sounds/intro.ogg");
--a:reproducir();
g.scene:set_world("../images/terreno/path");
g.scene:add_sprite("../images/E-P8.854.png",1);
g.scene:add_sprite("../images/anillo.png",1);
g.scene:add_sprite("../images/explode1.png",7);
.
.
.
Si te das cuenta la primera linea esta para que cuando le de doble clic se abra el interprete la función require es la forma en la que se llama a la biblioteca dinámica desde lua, la versión que uso es 5.1, la forma de llamar cambia en la 5.0
pero modificando un poco el código que tiene de ejemplo el tutorial quedando así:
- Código: Seleccionar todo
extern "C" {
#include "lua5.1/lua.h"
#include "lua5.1/lualib.h"
#include "lua5.1/lauxlib.h"
}
#include<iostream>
using namespace std;
int main(int argc,char* argv[])
{
lua_State *L;
if (argc<2)
{
printf("%s: <filename.lua>\n",argv[0]);
return 0;
}
L=lua_open();
luaL_openlibs(L); // load basic libs (eg. print)
if (luaL_loadfile(L,argv[1])==0) // load and run the file
{
cout<<"Control sedido al interpreter"<<endl;
lua_pcall(L,0,0,0);
}
else
printf("Error al cargar %s\n",argv[1]);
lua_close(L);
cout<<"Programa terminado"<<endl;
return 0;
}
Queda el interprete compilado en un ejecutable, por lo que no tiene que estar presente el ejecutable del interprete pero si sus bibliotecas dinámicas. El código anterior carga un archivo lua y lo ejecuta. podrías pasarle un archivo que contenga:
- Código: Seleccionar todo
x=3+2*2
print(x)
y se va a ejecutar.
De esta forma no está cargado ni un módulo es solo el interprete en sí, por lo que en teoría deberías poder cargar cualquier biblioteca dinámica preparada para ser interpretada y esta se debe ejecutar, de hecho hice la prueba y ejecuté el primer código en lua que mostré, y se ejecuto correctamente. Sobre la biblioteca libtank_war se tiene que encontrar en un directorio específico para que el interprete lo tome, o bien indicarle la ruta completa.
En el tutorial vas a encontrar ejemplos y vas a ver todo lo que se puede hacer con Lua y C++, comienza por lo sencillo, has un pequeño programa en c++ de una función hace el port con swig e intenta llamarla con el interprete.
En el tutorial no explica una cosa importante, al hacer el port swig recibe un archivo con terminación .i que es la declaración de las funciones, clases, etc de lo que tiene que portar, se hace asi:
- Código: Seleccionar todo
%module libtank_war
%{
#include "otras_declaraciones.h"
%}
%include <typemaps.i>
class top{
public:
int x,y;
int suma(x,y){return x+y;}
};
este archivo únicamente requiere los prototipos pues al compilar se llama a los .cpp aunque se pueden definir en el mismo código las funciones y también funciona.
Luego solo ejecutas: swig -c++ -lua example.i
y obtendrás un archivo para incluir en tu biblioteca dinámica. Al principio del tuto hay una así que sirve de ejemplo para desarrollar lo demás.
Para finalizar, en la página oficial de Lua puedes descargar las fuentes, me parece que hay para win, al igual que swig.
Saludos.
El conocimiento de unos es conocimiento de todos.