| 
 | 
 
目前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 
6、  测试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 
7、  测试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++的安装之旅即将结束,接下来就要学习一些基本的语法和用法啦。记住一点,要多练习才能真正的掌握它。 
 本文链接 
 
 |   
 
 
 
 |