编译添加云风pbc插件的Tolua.dll

编译添加云风pbc插件的Tolua.dll

三月 01, 2019

    好久没有更新过blog了,最近这两天在搞pbc的相关东西。在此总结记录一下。

    当初云风写pbc的初衷就是想可以方便的 binding 到动态语言中去用的。这里可以看一下云风blog中对pbc的介绍。

    在开始之前,需要做一些准备工作。

  • 下载tolua_runtime工程:
    git clone https://github.com/topameng/tolua_runtime
  • 下载pbc工程:
    git clone https://github.com/cloudwu/pbc
    tolua_runtime工程目录结构如下:
    images
    pbc工程目录结构如下:
    images

    准备工作完成之后,把pbc整个工程拷贝到tolua_runtime工程中。如果在Windows平台编译,需要先下载Msys2 64位

    直接下载配置好的Msys解压在C盘,根据自己要编译的32或64位版本,配置环境变量,我这里使用64位,所以配置C:\msys64\mingw64\bin。编译32位请运行mingw32_shell.bat,64位运行mingw64_shell.bat。
images
    修改build_win64.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++

    然后执行脚本进行编译,32位同理修改。编译成功后,将Plugins/x86_64文件夹下的tolua.dll拷贝到游戏工程中Plugins文件夹对应的位置。
images
    如果到这里就以为结束了,那就大错特错了。此时如果直接运行游戏工程,在require “protobuf.lua”时,会出现找不到”protobuf.c”的错误。还有以下两步:

  • 在LuaDLL.cs添加接口
    [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
    public static extern int luaopen_protobuf_c(IntPtr L);
  • 在LuaClient.cs中注册pbc
    protected virtual void OpenLibs()
    {
    luaState.OpenLibs(LuaDLL.luaopen_pb);
    luaState.OpenLibs(LuaDLL.luaopen_struct);
    luaState.OpenLibs(LuaDLL.luaopen_lpeg);
    luaState.OpenLibs(LuaDLL.luaopen_protobuf_c);
    }

    到这里,将pbc插件编译进tolua.dll基本就完成了。

参考文献: