做U3D手机游戏,最热门的技术组合是c#+lua,使用lua是因为可以热更新,而将c#与lua粘合起来的框架,目前最热门的是tolua框架,tolua框架有两部分组成,一个是c#部分,一个是c部分,整个框架在游戏代码中的位置是这样子的。如下图所示:
tolua C 起到承上启下的作用,是C#和lua的中间层,在和C#交互方面,作为非c#托管代码,会提供一些函数让c# DllImport,c#会通过Marshal等与非托管代码交互;在和lua交互方面,它符合lua扩展库标准,一方面通过lua的C API与lua虚拟机交互,另一方面会提供接口给lua脚本使用。
还有一些lua的扩展库,比如cjson、LuaSocket、sqlite3、lpeg、bit、pbc等手机游戏常用库,这些库扩展了lua的能力,本文要介绍的就是将这些第三方扩展库和lua源码(图中红色部分)一起编译成tolua的native库,windows平台叫做tolua.dll,android叫做libtolua.so,mac平台叫tolua.bundle,而iOS平台由于不允许使用动态库,所以会编译成静态库libtolua.a。
首先,先从tolua_runtime的github获取tolua.c开发包(感谢topament大佬)
在windows平台编译
用vs可以编译,但是我没试过,我是使用mingw来编译的,需要准备的工具:msys2(这个才可以编译x86_64)
安装MSYS2,关于如何在msys2安装gcc和make可以参考tolua_runtime/wiki,安装msys2和下载好gcc和make软件包后(可能链接时会报找不到libintl-8.dll的错,顺便也安装一下mingw-w64-x86_64-gettext这个软件包,pacman -S mingw-w64-x86_64-gettext),编译win32位程序要用mingw32.exe和编译win64位要用mingw64.exe
来到下载好的tolua_runtime目录,
执行脚本build_win_32.sh,这就编译好了windows平台下x86动态库。
执行脚本build_win_64.sh,这就编译好了windows平台下x86_64动态库。
脚本主要是执行make和gcc,如过自己有一些特殊的扩展库要编译,自行修改一下脚本添加就好,我在tolua_runtime下载下来的脚本中添加了pbc和lsqlite3的编译,下面是build_win64.sh的内容;
#!/bin/bash
# 62 Bit Version
mkdir -p window/x86_64
cd luajit
mingw32-make clean
mingw32-make BUILDMODE=static CC="gcc -m64 -O3"
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean
cd ..
gcc -m64 -O3 -std=gnu99 -shared \
tolua.c \
int64.c \
uint64.c \
pb.c \
pbc-lua.c \
lsqlite3.c \
lpeg.c \
struct.c \
cjson/strbuf.c \
cjson/lua_cjson.c \
cjson/fpconv.c \
lsqlite3/shell.c \
lsqlite3/sqlite3.c \
luasocket/auxiliar.c \
luasocket/buffer.c \
luasocket/except.c \
luasocket/inet.c \
luasocket/io