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

本文详细介绍了如何将pbc库集成到tolua的编译过程中,包括在Windows环境下通过修改build_win64.sh脚本添加pbc,并手动指定编译内容的两种方法,以及在Android环境下在Android.mk中指定编译路径和内容。
摘要由CSDN通过智能技术生成

目录
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文件了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值