Unity的lua項目爲Tolua# 編譯protobuf

記錄以備忘git

由於有別的現有架構,因此只是換lua中間件,同時須要protobuf,因此使用pbc加入編譯。tolua#在github上就有simpleframwork可用,我的項目能夠使用。github

  1. 下載tolua# 的runtime項目 https://github.com/topameng/tolua.git到D:/tolua#
  2. 下載luapbc 項目https://github.com/cloudwu/pbc.git到D:/tolua#/pbc

    此時tolua#項目結構爲shell

  3. 修改編譯腳本
#!/bin/bash
# 32 Bit Version
mkdir -p window/x86
# mingw32-make = 'C:\Ruby\DevKit\mingw\bin\mingw32-make.exe'
cd luajit
mingw32-make clean

mingw32-make BUILDMODE=static CC="gcc -m32 -O3"
cp src/libluajit.a ../window/x86/libluajit.a
mingw32-make clean
cd ..

# build protobuf fengyun ban pbc from https://github.com/cloudwu/pbc/
cd pbc
mingw32-make lib BUILDMODE=static CC="gcc -m32 -O3"
cp build/libpbc.a ../window/x86/libpbc.a
mingw32-make clean
cd ..

gcc -m32 -O3 -std=gnu99 -shared \
    int64.c \
    uint64.c \
    tolua.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 \
    luasocket/compat.c \ 
    pbc/binding/lua/pbc-lua.c \ 
    -o Plugins/x86/tolua.dll \
    -I./ \
    -Iluajit/src \
    -Ipbc \ 
    -Ipbc/src \
    -Icjson \
    -Iluasocket \
    -lws2_32 \
    -Wl,--whole-archive window/x86/libluajit.a window/x86/libpbc.a -Wl,--no-whole-archive -static-libgcc

這是修改好的win32平臺編譯腳本,修改了幾個內容以下:json

....
# 新加,編譯pbc.a
# build protobuf fengyun ban pbc from https://github.com/cloudwu/pbc/
cd pbc
mingw32-make lib BUILDMODE=static CC="gcc -m32 -O3"
cp build/libpbc.a ../window/x86/libpbc.a
mingw32-make clean
cd .. bash

gcc -m32 -O3 -std=gnu99 -shared \
   ... 架構

    pbc/binding/lua/pbc-lua.c \ # 新加,要編譯c代碼,另外一個是lua-53沒用到
    -o Plugins/x86/tolua.dll \
    ...
    -Ipbc \ # 新加,   頭文件目錄
    -Ipbc/src \# 新加,頭文件目錄 socket

    ...tcp

    -Wl,--whole-archive window/x86/libluajit.a window/x86/libpbc.a -Wl,--no-whole-archive -static-libgccui

把生成的libpbc.a包含到dll中。lua

4.修改代碼文件

pbc/binding/lua/pbc-lua.c 這個文件須要改一下
把 20行
#ifndef _MSC_VER
改爲
#if !defined( _MSC_VER ) && !defined( __MINGW32__ ) && !defined( __MINGW64__)

由於我用的mingw + msys編譯的,mingw沒有_MSC_VER 這個定義,因此只好加mingw本身的

5.編譯,運行mingw的msys.bat,在彈出的shell窗口cd到tolua#目錄,運行./build_win32.sh生成tolua.dll在plugins/x86/目錄下,拷貝到項目plugins/x86就行了。

6.使用

  1. 複製生成的dll文件到使用tolua#的unity項目plugins/x84或x86_64下,
  2. 修改luadll.cs,添加c接口,在適當的位置以下寫

        /*

        ** third party library
        */
        
        [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
        public static extern int luaopen_protobuf_c(IntPtr L);

        3.啓動lua時註冊proto庫, 

        luaState.OpenLibs(LuaDLL.luaopen_pb);
        luaState.OpenLibs(LuaDLL.luaopen_struct);
        luaState.OpenLibs(LuaDLL.luaopen_lpeg);
        #if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
        luaState.OpenLibs(LuaDLL.luaopen_bit);
        //lua.OpenLibs(LuaDLL.luaopen_bit);
        #endif 
        //luaState.OpenLibs(LuaDLL.luaopen_sproto_core);
        luaState.OpenLibs(LuaDLL.luaopen_protobuf_c);

        就和lua註冊別的第三方庫同樣,找到而後把proto的註冊調用加上,就能夠寫lua代碼了,參考pbc自帶的demo


     

 

注:

tolua#項目地址https://github.com/topameng/tolua

若是沒裝mingwin的話能夠下載tdm-gcc,在SourceForge搜tdm mingw就有http://jaist.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%20Installer/tdm64-gcc-5.1.0-2.exe

安裝64位版的,由於也要編譯64位dll。

安裝方法:

1,運行安裝文件,目錄選擇d:/mingw(自定義)

2,mingw安裝到d:/mingw.配置bin目錄到path環境變量。

3,下載msys,解壓或安裝(能夠是執行文件和壓縮包文件)到d:msys(自定義)https://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/

4,修改msys目錄下msys.bat,在第一行以前加入call "D:\Development\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"(vs2015的環境變量腳本,根據安裝的vs來寫,或者不加)

5,修改關聯文件,d:msys/etc/fstab文件,可安裝fstab.sample修改,即關聯mingw所在安裝目錄,大體內容爲:

#Win32_Path        Mount_Point
D:/MinGW             /mingw

6,基本完成了,執行msys.bat在彈出的shell窗口能夠導航到tolua#進行編譯了。

相關文章
相關標籤/搜索