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++的安裝之旅即將結束,接下來就要學習一些基本的語法和用法啦。記住一點,要多練習才能真正的掌握它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM