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