Tolua#添加云风的PBC插件

由于我没有mac,所以没有xcode,所以没有编iOS版本的

windows下用msys2+mingw64去编译。

1. 下载msys2, http://www.msys2.org/ ,下载安装好之后打开,按照官网安装说明先更新一波

2.  参考这个 https://github.com/topameng/tolua_runtime/wiki ,安装mingw64就行,32位看情况吧。现在版本可能会有问题,会报libintl-8.dll is missing,然后导致mingw64.exe无法打开,这是因为没有安装mingw-w64-x86_64-gettext 东西的原因,指令是:pacman -S mingw-w64-x86_64-gettext   装了就好了,如果不对就pacman -Sl搜一下

3. 下载tolua# runtime版本https://github.com/topameng/tolua_runtime,

4. 下载pbc https://github.com/cloudwu/pbc ,把pbc放到tolua runtime版本的文件夹下

5.  tolua文件夹下有一排.sh文件,把build_windows64.sh用编辑器打开,

#!/bin/bash
# 64 Bit Version
mkdir -p window/x86_64

cd luajit-2.1
mingw32-make clean

mingw32-make BUILDMODE=static CC="gcc -m64 -O2" XCFLAGS=-DLUAJIT_ENABLE_GC64
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean

cd ..

#build protobuf yunfeng ban pbc from https://github.com/cloudwu/pbc
cd pbc
mingw32-make BUILDMODE=static CC="gcc -m64 -O2" XCFLAGS=-DLUAJIT_ENABLE_GC64
cp build/libpbc.a ../window/x86_64/libpbc.a
mingw32-make clean
cd ..

gcc -m64 -O2 -std=gnu99 -shared \
 tolua.c \
 int64.c \
 uint64.c \
 pb.c \
 lpeg.c \
 struct.c \
 cjson/strbuf.c \
 cjson/lua_cjson.c \
 cjson/fpconv.c \
 luasocket/auxiliar.c \
 luasocket/buffer.c \
 luasocket/except.c \
 luasocket/inet.c \
 luasocket/io.c \
 luasocket/luasocket.c \
 luasocket/mime.c \
 luasocket/options.c \
 luasocket/select.c \
 luasocket/tcp.c \
 luasocket/timeout.c \
 luasocket/udp.c \
 luasocket/wsocket.c \
 pbc/binding/lua/pbc-lua.c \
 -o Plugins/x86_64/tolua.dll \
 -I./ \
 -Iluajit-2.1/src \
 -Iluasocket \
 -Ipbc \
 -Ipbc/src \
 -lws2_32 \
 -Wl,--whole-archive window/x86_64/libluajit.a window/x86_64/libpbc.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++
复制粘贴……自己比对去吧……注意一下pbc的东西
6.  打开mingw64.exe,我的路径是cd e:/git/tolua ,其他的看自己路径怎么写,总之先到这个.sh的路径去,然后./build_win64.sh回车等着吧。

7. 生成的dll在Plugins\x86_64,替换掉unity工程里的那个dll

8. Google的那个proto工具不一定有protoc.exe,没有就自己开工程编一个,这事儿一般找服务器……没有服务器就自己编好了……然后把这个protoc.exe跟protogen.exe放到一起去

9. 写个批处理文件,然后生成.pb文件

@echo off

cd /d %~dp0

set pbdest=..\..\Client\Assets\StreamingAssets\protopb
for /r %%i in (*.proto) do (
	
	protoc.exe -I %~dp0 -o%pbdest%\%%~ni.pb %%i	

)
pause

我自己写了个测试路径,反正这种二进制文件,要在游戏开启的时候先加载,然后再启动lua虚拟机,然后再注册!!!切记!!!一定要先加载!!!!

p.s. 我这个路径里面,protoc.exe和proto文件在一个路径下,如果不在一个路径下,生成的pb文件可能有问题,反正如果拿不准就到时候打开看一下好了,看下文件名对不对。

10. 由于lua的io在客户端没法读文件,所以只能用unity拿到.pb文件生成byte数组然后传给lua使用,具体看项目需求了,lua里就是protobuf.register(xxxx),然后protobuf.decode("消息名", pb_data)解码,解出来的可能打印出来很诡异,没关系,拿着用就行。然后编码就是encode,看示例就好了。


这里面要说明的是

1. 打包的时候,只要mingw不报错,那就是没错,不要怀疑底层代码有问题。

2. 如果register失败,就看一下生成的.pb文件里面,文件名那个地方是不是路径不对,路径不对可能导致register失败,尤其是当一个proto文件import了另外一个proto文件的时候就很容易出这样的问题

3. decode出来的table打印出来可能很奇怪,但是只要按着proto定义xx.xx.xx.xx这么一直点出来就好了,内容肯定有。

4. 如果mingw配置有问题,去配置一下环境变量


参考文献

https://my.oschina.net/chaloongjir/blog/755954


你可能感兴趣的:(Tolua#添加云风的PBC插件)