微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

lua和tolua++的安装

目前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','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,const char* type)

tolua_map.c  398行

修改if (tolua_newMetatable(L,ctype) && tolua_newMetatable(L,type))

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐