目前lua发布的最新版本是2011年12月12日发布的lua-5.2.0.tar.gz,而tolua++发布的最新版本为tolua++-1.0.93.tar.bz2,该版本暂时不支持lua5.2(其实简单修改下代码也可以支持的),所以我们以上一版本的lua-5.1.4.tar.gz为例,讲解tolua++的安装方式。安装环境为RHEL5.5。
一、下载相关软件包
lua包:http://www.lua.org/ftp/lua-5.1.4.tar.gz
tolua++包:http://www.codenix.com/~tolua/tolua++-1.0.93.tar.bz2
scons包:http://www.scons.org/ 下载Development (2.1.0)->RPM,该安装包依赖python,如未安装,请先安装python。
二、 安装过程
1、 安装lua
解压
/usr/local#tar zxvf lua-5.1.4.tar.gz
/usr/local#cd lua-5.1.4/
编译
/usr/local/lua-5.1.4#make linux
安装
/usr/local/lua-5.1.4#make install
2、 安装scons
/usr/local#rpm -ivh scons-2.1.0-1.noarch.rpm
3、 安装tolua++
解压(修改文件名,把空格去掉)
/usr/local#tar jxvf tolua-1.0.93.tar.bz2
/usr/local#cd tolua++-1.0.93/
修改配置
/usr/local/tolua++-1.0.93#vim config_linux.py
找到LIBS = ['lua50', 'lualib50', 'dl', 'm']
改为LIBS = ['lua', 'dl', 'm']
编译
/usr/local/tolua++-1.0.93#scons all
安装
/usr/local/tolua++-1.0.93#scons install
4、 查看
/usr/local#cd bin
/usr/local/bin#ls
lua luac tolua++
/usr/local#cd lib
/usr/local/lib#ls
liblua.a libtolua++.a
解释:之所以修改tolua++的配置文件,是因为lua编译过程中生成的是一个静态库liblua.a,所以我们需要修改连接的库文件,最终我们生成的是libtolua++.a这个静态库文件。与之前的版本不同,只有两个库文件。
三、 旁门左道
项目当中一般会用到lua和tolua++这两个库文件,而且这两个的可执行文件也需要。索性就把lua和tolua++的代码编成一个动态库,然后再把两个可执行文件编译出来,这样似乎更能够贴近我们的项目,如果想要扩展动态库,只需要继续添加我们新的文件,修改makefile即可。
1、 新建文件夹
新建tolua文件夹
在tolua文件夹下新建src、include、bin、lib四个文件夹
在tolua/src下新建lua、tolua两个文件夹
2、 拷贝文件
将lua-5.1.4/src/lua.c拷贝到tolua/src/lua
将lua-5.1.4/src下除lua.c外的*.c文件拷贝到tolua/src
将lua-5.1.4/src/*.h拷贝到tolua/include
将lua-5.1.4/ etc/ lua.hpp拷贝到tolua/include
将tolua++-1.0.93/src/lib/*.c拷贝到tolua/src/
将tolua++-1.0.93/src/lib/*.h拷贝到tolua/include
将tolua++-1.0.93/src/bin/ toluabind.h拷贝到tolua/include
将tolua++-1.0.93/src/bin/tolua.c和toluabind.c拷贝到tolua/src/tolua
目录结构如下:
|-- bin
|-- include
| |-- lapi.h
| |-- lauxlib.h
| |-- lcode.h
| |-- ldebug.h
| |-- ldo.h
| |-- lfunc.h
| |-- lgc.h
| |-- llex.h
| |-- llimits.h
| |-- lmem.h
| |-- lobject.h
| |-- lopcodes.h
| |-- lparser.h
| |-- lstate.h
| |-- lstring.h
| |-- ltable.h
| |-- ltm.h
| |-- lua.h
| |-- lua.hpp
| |-- luaconf.h
| |-- lualib.h
| |-- lundump.h
| |-- lvm.h
| |-- lzio.h
| |-- tolua++.h
| |-- tolua_event.h
| `-- toluabind.h
|-- lib
`-- src
|-- lapi.c
|-- lauxlib.c
|-- lbaselib.c
|-- lcode.c
|-- ldblib.c
|-- ldebug.c
|-- ldo.c
|-- ldump.c
|-- lfunc.c
|-- lgc.c
|-- linit.c
|-- liolib.c
|-- llex.c
|-- lmathlib.c
|-- lmem.c
|-- loadlib.c
|-- lobject.c
|-- lopcodes.c
|-- loslib.c
|-- lparser.c
|-- lstate.c
|-- lstring.c
|-- lstrlib.c
|-- ltable.c
|-- ltablib.c
|-- ltm.c
|-- lua
| `-- lua.c
|-- luac.c
|-- lundump.c
|-- lvm.c
|-- lzio.c
|-- print.c
|-- tolua
| |-- tolua.c
| `-- toluabind.c
|-- tolua_event.c
|-- tolua_is.c
|-- tolua_map.c
|-- tolua_push.c
`-- tolua_to.c
3、 建立makefile
索性直接拷贝吧,下边是我写好的
CFLAGES = -O2 -I./include
LDFLAGES = -L./lib -ltolua++
CC = gcc
OBJSDIR = src
LIB = lib
BIN = bin
OBJS = $(OBJSDIR)/luac.o \
$(OBJSDIR)/tolua_event.o \
$(OBJSDIR)/tolua_push.o \
$(OBJSDIR)/print.o \
$(OBJSDIR)/lzio.o \
$(OBJSDIR)/ltm.o \
$(OBJSDIR)/lstring.o \
$(OBJSDIR)/lopcodes.o \
$(OBJSDIR)/lobject.o \
$(OBJSDIR)/lmem.o \
$(OBJSDIR)/lmathlib.o \
$(OBJSDIR)/llex.o \
$(OBJSDIR)/linit.o \
$(OBJSDIR)/lgc.o \
$(OBJSDIR)/ldump.o \
$(OBJSDIR)/lfunc.o \
$(OBJSDIR)/lvm.o \
$(OBJSDIR)/ltable.o \
$(OBJSDIR)/lparser.o \
$(OBJSDIR)/lcode.o \
$(OBJSDIR)/lstate.o \
$(OBJSDIR)/loslib.o \
$(OBJSDIR)/liolib.o \
$(OBJSDIR)/ldo.o \
$(OBJSDIR)/ldblib.o \
$(OBJSDIR)/lauxlib.o \
$(OBJSDIR)/lbaselib.o \
$(OBJSDIR)/ltablib.o \
$(OBJSDIR)/lundump.o \
$(OBJSDIR)/tolua_is.o \
$(OBJSDIR)/ldebug.o \
$(OBJSDIR)/lapi.o \
$(OBJSDIR)/lstrlib.o \
$(OBJSDIR)/loadlib.o \
$(OBJSDIR)/tolua_to.o \
$(OBJSDIR)/tolua_map.o
LUA_O = $(OBJSDIR)/lua/lua.c
TOLUA_O = $(OBJSDIR)/tolua/tolua.c \
$(OBJSDIR)/tolua/toluabind.c
TARGET = libtolua++.so
$(TARGET):$(OBJS)
$(CC) -shared -o $(LIB)/$@ $^ -lm $(CFLAGES)
$(OBJS):%.o:%.c
$(CC) $? -c -fPIC -o $@ $(CFLAGES)
lua:
$(CC) -o $(BIN)/$@ $(LUA_O) $(CFLAGES) $(LDFLAGES)
tolua++:
$(CC) -o $(BIN)/$@ $(TOLUA_O) $(CFLAGES) $(LDFLAGES)
install:
mkdir -p /usr/local/bin /usr/local/include
cd bin && install -p -m 0755 lua tolua++ /usr/local/bin
cd include && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp tolua++.h /usr/local/include
cd lib && install -p -m 0644 libtolua++.so /lib
ldconfig
uninstall:
cd /usr/local/bin && $(RM) lua tolua++
cd /usr/local/include && $(RM) lua.h luaconf.h lualib.h lauxlib.h lua.hpp tolua++.h
cd /lib && $(RM) libtolua++.so
clean:
$(RM) $(LIB)/$(TARGET) $(OBJS) $(BIN)/*
4、 修改代码
别急着编译,代码有问题
tolua_is.c 119行
修改static int lua_isusertable (lua_State* L, int lo, const const char* type)
为static int lua_isusertable (lua_State* L, int lo, const char* type)
tolua_map.c 398行
修改if (tolua_newmetatable(L,ctype) && tolua_newmetatable(L,type))
为if (tolua_newmetatable(L,ctype) && tolua_newmetatable(L,(char*)type))
5、 编译、安装、卸载
编译tolua++.so
make
编译lua可执行文件
make lua
编译tolua++可执行文件
make tolua++
安装
make install
卸载
make uninstall
四、 验证
1、 测试lua
lua的helloworld
直接在命令行运行lua,输入print 'hello world'
/usr/local#lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print 'hello world'
hello world
2、 测试tolua++
直接命令行输入tolua++,会打印help信息
/usr/local#tolua++
常用命令如下:
-o 设置输出文件,即.c或.cpp文件
-n 设置包的名称,默认是输入文件的根名称
举例:
以tolua++-1.0.93/src/tests/tclass.*为例
/home/tolua/tclass#rm tclass.cpp
/home/tolua/tclass#tolua++ -n tclass -o tclass.cpp tclass.pkg
新建main.cpp加入测试代码:
/home/tolua/tclass#vi main.cpp
#include "lua.hpp"
#include "tolua++.h"
#include "tclass.h"
int tolua_tclass_open (lua_State* tolua_S);
int main ()
{
Test::Tst_B* b = new Test::Tst_B; // instance used in Lua code
lua_State* L = lua_open();
luaL_openlibs(L);
tolua_tclass_open(L);
luaL_dofile(L,"tclass.lua");
lua_close(L);
delete b;
return 0;
}
编译:
/home/tolua/tclass#g++ -o test main.cpp tclass.cpp -ltolua++
运行:
/home/tolua/tclass#./test
结果:
deleting C: 6
deleting C: 7
deleting C: 8
deleting C: 9
e is type Test::Tst_B
ae is type nil
hello world
method!
static!
***** cast
type is userdata
bcast is userdata: 0x3dbe688
type is Test::Tst_B
B
table: 0x3dbd1c0
table: 0x3dc3180
table: 0x3dbd1c0
function: 0x3dc3640
function: 0x3dbfb50
userdata: 0x3dc8948
Test::Tst_B
this is 0x3dbe5b0, ptr is 0x3dbe5b0
this is 0x3dbe5b0, ptr is 0x3dbe5b0
1
2
3
deleting C: 10
Class test OK
到此,我们的tolua++的安装之旅即将结束,接下来就要学习一些基本的语法和用法啦。记住一点,要多练习才能真正的掌握它。