在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
目前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++的安装之旅即将结束,接下来就要学习一些基本的语法和用法啦。记住一点,要多练习才能真正的掌握它。 |
请发表评论