目录
1、编译工具和环境说明
2、基础编译tolua
3、以pbc为例子,添加第三方库
4、更新luaJit
大家好,我是阿赵。
之前分享过怎样正常编译基础版本的tolua。这次用添加pbc为例,看看怎样往tolua里面添加其他的第三方库。知道了方法之后,添加其他的第三方库或者自己写的代码,也是同样的道理。
一、下载pbc
这里我下载的是云风的pbc
下载地址
然后把pbc里面的内容复制到tolua文件夹内
二、编译Windows
这里可以有2种方式去添加pbc到tolua的编译里面。由于32位和64位的添加方式没有区别,所以就以64位为例。
1、先编译libpbc.a
修改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++
这时候执行编译,会先编译出一个libpbc.a,然后再编译出tolua.dll
主要修改
1.编译libpbc.a
#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 ..
2.添加pbc-lua.c 编译
pbc/binding/lua/pbc-lua.c \
3.添加手动指定的pbc代码路径
-Ipbc \
-Ipbc/src \
4.最终编译添加libpbc.a
-Wl,--whole-archive window/x86_64/libluajit.a window/x86_64/libpbc.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++
2、手动指定新增编译内容
修改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 ..
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 \
pbc/src/alloc.c \
pbc/src/array.c \
pbc/src/bootstrap.c \
pbc/src/context.c \
pbc/src/decode.c \
pbc/src/map.c \
pbc/src/pattern.c \
pbc/src/proto.c \
pbc/src/register.c \
pbc/src/rmessage.c \
pbc/src/stringpool.c \
pbc/src/varint.c \
pbc/src/wmessage.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 -Wl,--no-whole-archive -static-libgcc -static-libstdc++
这次再执行编译,不会再出现libpbc.a,直接就出来了tolua.dll
主要修改:
1.添加pbc-lua.c编译
pbc/binding/lua/pbc-lua.c \
2.手动添加pbc代码编译
pbc/src/alloc.c \
pbc/src/array.c \
pbc/src/bootstrap.c \
pbc/src/context.c \
pbc/src/decode.c \
pbc/src/map.c \
pbc/src/pattern.c \
pbc/src/proto.c \
pbc/src/register.c \
pbc/src/rmessage.c \
pbc/src/stringpool.c \
pbc/src/varint.c \
pbc/src/wmessage.c \
3.手动指定pbc代码路径
-Ipbc \
-Ipbc/src \
这两种方式各有优缺点
第一种方式,好处是不需要逐个包含的文件,不怕漏文件,缺点是需要多一步生成libpbc.a的编译过程
第二种方式,好处是灵活处理,需要哪个文件就添加哪个文件,缺点是需要指定的文件多的时候,可能会出现错漏。
然后要注意一点,不管是哪种方式,我们都需要通过-I来指定包含程序的文件夹。这是因为,在源码的.c文件里面,会自己include很多其他的文件,这些文件如果不指定包含的路径,会出现找不到的现象。因为我这里是把pbc整个文件夹都拷贝进来了,里面有些文件是包含在pbc文件夹,有些文件是包含在pbc/src文件夹,所以我两个文件夹都包含进来。
其实也可以不用整个pbc项目源码拷贝进来,实际有用的是3个东西:
1.pbc-lua.c
它在binding/lua目录下
2.pbc.h
3.src文件夹
里面的所有内容。
如果需要用第二种手动添加编译内容的方法来编译,只需要把以上说的3种内容拷贝到tolua文件夹的pbc文件夹里面,然后在手动指定的时候,根据实际情况来填包含的文件就可以了。
三、编译安卓
安卓需要编译的内容,在tolua/android/jni/Android.mk文件里面指定
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libluajit
LOCAL_SRC_FILES := libluajit.a
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_MODULE := tolua
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../luajit-2.1/src
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc/src
LOCAL_CPPFLAGS := -O2
LOCAL_CFLAGS := -O2 -std=gnu99
LOCAL_SRC_FILES := ../../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/usocket.c \
../../pbc/binding/lua/pbc-lua.c \
../../pbc/src/alloc.c \
../../pbc/src/array.c \
../../pbc/src/bootstrap.c \
../../pbc/src/context.c \
../../pbc/src/decode.c \
../../pbc/src/map.c \
../../pbc/src/pattern.c \
../../pbc/src/proto.c \
../../pbc/src/register.c \
../../pbc/src/rmessage.c \
../../pbc/src/stringpool.c \
../../pbc/src/varint.c \
../../pbc/src/wmessage.c \
LOCAL_WHOLE_STATIC_LIBRARIES += libluajit
include $(BUILD_SHARED_LIBRARY)
主要修改:
1.指定包含代码的路径
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc/src
道理和编译Windows一样,是为了让include的文件能在指定的文件夹里面被找到
2.手动指定需要编译的代码
../../pbc/src/alloc.c \
../../pbc/src/array.c \
../../pbc/src/bootstrap.c \
../../pbc/src/context.c \
../../pbc/src/decode.c \
../../pbc/src/map.c \
../../pbc/src/pattern.c \
../../pbc/src/proto.c \
../../pbc/src/register.c \
../../pbc/src/rmessage.c \
../../pbc/src/stringpool.c \
../../pbc/src/varint.c \
../../pbc/src/wmessage.c \
修改完Android.mk,就可以正常的编译安卓的so文件了。