• 编译tolua——3、以pbc为例子,添加第三方库


    目录
    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++
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    这时候执行编译,会先编译出一个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 ..
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.添加pbc-lua.c 编译

    pbc/binding/lua/pbc-lua.c \
    
    • 1

    3.添加手动指定的pbc代码路径

     -Ipbc \
     -Ipbc/src \
    
    • 1
    • 2

    4.最终编译添加libpbc.a

     -Wl,--whole-archive window/x86_64/libluajit.a window/x86_64/libpbc.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++
    
    • 1

    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++
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    这次再执行编译,不会再出现libpbc.a,直接就出来了tolua.dll
    主要修改:

    1.添加pbc-lua.c编译

    pbc/binding/lua/pbc-lua.c \
    
    • 1

    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 \
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.手动指定pbc代码路径

    -Ipbc \
    -Ipbc/src \
    
    • 1
    • 2

    这两种方式各有优缺点
    第一种方式,好处是不需要逐个包含的文件,不怕漏文件,缺点是需要多一步生成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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    主要修改:

    1.指定包含代码的路径

    LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../pbc/src
    
    • 1
    • 2

    道理和编译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 \
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    修改完Android.mk,就可以正常的编译安卓的so文件了。

  • 相关阅读:
    几个常用的Numpy函数详解
    在 Python 中打印二叉树
    RAMAN 中 OPTIMIZATION 优化选项的作用
    浅析量化交易是什么类型的交易?
    无涯教程-Android - List View函数
    C++ 内联和嵌套命名空间
    C#11之原始字符串
    ActiveReportsJS 3.2 中文版前端在线报表ActiveReportsJS
    搭建自己的以图搜图系统 (一):10 行代码以图搜图
    Spring的BeanFactory与FactoryBean的区别
  • 原文地址:https://blog.csdn.net/liweizhao/article/details/131143338