编译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++

这时候执行编译,会先编译出一个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文件了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29060.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地项目托管到 Gitee

本地项目托管到 Gitee 1、创建远程仓库2、Git Bash Here第一步:初始化本地仓库 git init第二步:建立链接git remote add origin xxx第三步:将远程仓库中的文件推送至本地仓库中git pull --rebase origin master第四步:将本地项目放…

【利用AI让知识体系化】简要了解网络七层协议

文章目录 一、前言引言目的和意义 二、网络七层协议简介OSI参考模型七层协议分层结构和各层协议简介 三、物理层 - Layer 1物理层概述物理层的作用物理层标准和协议 四、数据链路层 - Layer 2数据链路层概述常见的协议 五、网络层 - Layer 3网络层概述网络层的作用IP地址的作用…

cool-admin框架后端使用-node版本,线上宝塔部署

版本6.x 宝塔新建一个文件夹和创建好数据库,记录账号和密码,自行创建,不做说明 特别注意,如果用宝塔node管理那里运行,如果按照到有pm2的,要先卸载,不可以共存,会有冲突 cool-vue前端…

爬虫数据采集需要什么样的代理ip以及遇到的反爬措施

随着互联网的快速发展,数据已经成为许多行业中的重要资源。网络爬虫作为一种数据采集工具,在许多领域中得到了广泛应用。但是现在很多网站都有非常多的限制,所以在爬取数据的时候,还需要借助代理ip来助力,才能更好的完…

谁说不可兼得,用scrcpy实现手机免流播放bilibili投屏电脑

目前的手机大额流量卡都是支持设备免流的,但是如何将这个流量用在其他设备,就相当麻烦。于是我查找了些相关Android投屏技术资料,发现了一个简单的USB投屏工具——scrcpy。 安装说明 Office:https://github.com/Genymobile/scrcp…

深度学习之卷积神经网络(CNN)

大家好,我是带我去滑雪! 卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度学习的前馈神经网络,主要用于图像和视频识别、分类、分割和标注等计算机视觉任务。它主要由卷积层、池化层、全连接…

手机技巧:安卓微信 8.0.38 内测版本功能一览

2023年6月14号安卓版本的微信8.0.38又开始内测了,今天就赶紧下载体验一下,下面就来给大家一一介绍,本次安卓微信内测版本功能更新,感兴趣的朋友可以文末下载体验一下! 首先看一下官方的更新内容: 本次更新…

网络安全实验室|网络信息安全攻防学习平台(脚本关1-6)

传送门: http://hackinglab.cn/ 1. key又又不见了 点击此处开启抓包,send ti repeater 模块 yougotit_script_now2. 快速口算 脚本来源: https://blog.csdn.net/hzxtjx/article/details/125692349 import requests,re# 自动处理cookies&a…

Java+Swing+mysql仿QQ聊天工具

JavaSwingmysql仿QQ聊天工具 一、系统介绍二、功能展示1.用户登陆2.好友列表3.好友聊天4.服务器日志 三、系统实现四、其它1.其他系统实现2.获取源码 一、系统介绍 系统主要功能:用户登陆、好友列表、好友聊天、服务器日志 二、功能展示 1.用户登陆 2.好友列表 3…

Ubuntu远程装载硬盘Mount and unmount disk

小虎本来以为Ubuntu(Linux系统)不能够远程装载硬盘,每次重开机都要线下重新装载硬盘。但是苦于工作站不在身边,跑来跑去太麻烦,所以想远程装载一下。 解决方法 遍历搜索所有硬盘。找到对应名字。 lsblk创建一个文件…

Unity中Camera参数—Culling Mask详解

Culling Mask 如下图所示: 显示层级如下: 应用: Culling Mask :主要是相机针对不同层级的物体进行渲染的操作(想让相机渲染哪个层就勾选哪个层) 层级介绍: unity中的层前7个被unity锁定&#…

RISC-V体系结构的U-Boot引导过程 第一阶段

RISC-V体系结构的U-Boot引导过程 第一阶段 flyfish .globl _start _start:.globl使符号对链接器可见相当于C语言中的Extern,声明此变量,并且告诉链接器此变量是全局变量,外部可以访问.u-boot.lds里的ENTRY(_start)也是这里的_start。 即指定…

儿童遗留监测成为「加分项」,多种技术路线「争夺战」一触即发

儿童遗留密闭车内,温度可以在短短15分钟内达到临界水平,从而可能导致中暑和死亡,尤其是当汽车在太阳底下暴晒。 按照Euro NCAP给出的指引,与车祸相比,儿童因车辆中暑而死亡的情况较少,但却是完全可以避免的…

基于改进MRAS算法的永磁同步电机参数辨识

基于改进MRAS算法的永磁同步电机参数辨识 摘 要永磁同步点电机参数辨识算法介绍永磁同步电机数学模型改进MRAS参数辨识算法递推最小二乘法辨识原理递推最小二乘法结合MRAS算法原理仿真结果分析总结 摘 要 在永磁同步电机运行时,电机的电气参数会受到温度以及磁链饱…

【使用指导】wifi蓝牙二合一模块LCS2028与服务器的数据收发功能测试指导

在物联网智能家居、智能照明、智能楼宇、智慧工厂、智能制造等领域的数据透传、智能控制应用中,支持UART串口通信的低功耗WiFi蓝牙二合一模块应用极为广泛。模块性能测试环节中会测试模块与服务器的数据收发功能,确保功能性能够满足项目应用需求。本篇就…

在Mybatis执行插入数据时,如何将Date类型字段设置为“yyyy-MM-dd”的格式

1、问题描述 使用mybatis新增插入一条数据到MySQL数据库时, 其中实体类对象的一个属性”hiredate“的类型是日期类型Date, 此属性在数据库中对应的字段“hiredate”类型也是日期Date类型, 但是在数据库中要求“hiredate”字段的字段值为“yy…

Kendo UI R2 2023 crack

Kendo UI R2 2023 crack 新组件:角度PDFViewer 直接在Angular应用程序中查看PDF文件,无需第三方软件或附加组件。 凭借直观的分页机制、强大的搜索功能和灵活的缩放选项,用户可以轻松导航和浏览PDF内容。 角度16支架 Angular 16引入了一系列改…

视频网页前端禁止截屏代码实现js

有言在先 原理是采用商业级DRM实现,DRM 许可证费用目前没有免费服务商,腾讯云价格是0.0056元/次。 另外此功能不兼容安卓,安卓系统无法正常播放视频! 先展示效果 可以看到截屏时刻出现黑屏,录屏也能保证全黑状态。…

搭建Freekan私人影视电影网站,cpolar内网穿透发布上线

文章目录 1.前言2.本地网页搭建2.1 环境使用2.2 支持组件和环境设置2.3 支持组件选和环境设置2.4 网页安装2.5 测试和使用2.6 问题解决 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDNprobezy的文章:使用Cpolarfreekan源码…

驱动开发:内核RIP劫持实现DLL注入

本章将探索内核级DLL模块注入实现原理,DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可,驱动级别的注入有多种实现原理,而其中最简单的一种实现方式则是通过劫持EIP的方式实现,其实现原理可总结为&am…