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

  • 相关阅读:
    深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列
    消息队列使用的四种场景介绍
    《深入理解Java函数式编程》系列文章
    搭建微服务框架(Spring Boot + Dubbo + Docker + Jenkins)
    spring boot 整合dubbo
    IDEA中使用springBoot+gradle构建多模块项目
    Mac上zookeeper的安装与启动
    redis常用客户端命令
    mac下安装、配置redies
    轻松看懂机器学习常用算法
  • 原文地址:https://www.cnblogs.com/osyun/p/2320698.html
Copyright © 2011-2022 走看看