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

news2025/2/1 12:52:26

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好,我是郭东白。上节课我们讲了为什么要做阶段性的价值交付,以及进入阶段性价值交付环节的准备工作。有了这些学习基础,这节课我们就可以进行阶段性价值交付了。 在交付的过程中,主要有三部分工作:目标分解、定义交…

SLAM十四讲——ch4实践(李群李代数)

视觉SLAM14讲----ch4的操作及避坑 一、ch4的实践的准备工作二、各个实践操作1. Sophus的基本使用方法2. 例子:评估轨迹误差 三、遇到的问题 一、ch4的实践的准备工作 确保已经有Sophus库,Sophus库是一个较好的李代数库。 注意: 开始时slamb…

MySQL 数据库实用指南:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏,本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书,小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结:文末赠书 一、准备测…

Linux之进程间通信——system V(共享内存、消息队列、信号量等)

文章目录 前言一、共享内存1.共享内存的基本原理2.共享内存的创建3.共享内存的控制参数返回值共享内存的内核数据结构 4.共享内存的关联参数 5.共享内存的去关联6.查看IPC资源7.查看共享内存8.删除共享内存 二、实现进程间通信(代码)三、共享内存的特点四…

【Newman+Jenkins】实施接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子,哈哈,开玩笑啦。。。别当真,简单地说Newman就是命令行版的Postman,查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行,把Postman界面化运…

软件测试—冒烟测试

1. 核心 冒烟测试就是完成一个新版本的开发后,对该版本最基本的功能进行测试,保证基本的功能和流程能走通。 如果不通过,则打回开发那边重新开发; 如果通过测试,才会进行下一步的测试(功能测试,集成测试…

【ThreadLocal为什么可能内存泄漏?】 —— 每天一点小知识

💧 T h r e a d L o c a l 为什么可能内存泄漏? \color{#FF1493}{ThreadLocal为什么可能内存泄漏?} ThreadLocal为什么可能内存泄漏?💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个…

渗透测试综合实验

文章目录 一、前期交互二、信息搜集三、威胁建模五、渗透攻击1.弱口令攻击2.SQL注入3.不安全文件上传 六、后渗透攻击利用1.蚁剑安装2.一句话木马利用 七、漏洞报告 一、前期交互 二、信息搜集 使用nmap收集端口、域名、后台信息 目标IP nmap -O -sV IP 三、威胁建模 寻…

基于javaweb jsp+servlet实验室设备管理系统的设计与实现

一.项目介绍 本系统分为 超级管理员、老师、学生三类角色 超级管理员:通知管理、维护用户信息、实验室管理(负责维护实验室、预约实验室)、设备管理(维护技术参数、维护运行数据、维护电子文档)、设备维修管理&am…

第5章 总体设计

第5章 总体设计 总体设计是决定”怎样做”。也就是概括的说,系统应该如何实现,因此总体设计也被称作概要设计。 5.1 设计过程 例题 5.2 设计原理 5.2.1 模块化 模块是由边界元素限定的相邻程序元素(例如,数据说明,…

【Spring Boot】Spring Boot特点及重要策略,含安装步骤详细讲解

前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应…

Matplotlib 绘制多图

Matplotlib 绘制多图 我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。 subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。 subplot subplot(nrows, ncols, inde…

微服务_Nacos

简介 Nacos(全称为“动态服务发现、配置和服务管理平台”)是阿里巴巴开源的一款云原生服务发现和配置管理平台,支持多种语言和多种环境,包括Kubernetes、Docker、Spring Cloud等常见的云原生环境。它提供了服务发现、配置管理、服…

MFC的定义和实际操作方法

我是荔园微风,作为一名在IT界整整25年的老兵,今天从另一个角度来看一下MFC。 完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类 过程:CWinApp创建CF…

算法刷题-链表-反转链表

反转链表 206.反转链表思路C代码双指针法递归法其他语言版本使用虚拟头结点解决链表翻转使用栈解决反转链表的问题 反转链表的写法很简单,一些同学甚至可以背下来但过一阵就忘了该咋写,主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 …

【Java基础篇】方法的使用(方法的使用以及形参实参的关系)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏:Java.SE,本专栏主要讲解运算符,程序逻辑控制,方法的使用&…

【线程安全问题】线程互斥与线程同步技术

在达内Windows/Win32编程专栏中,我们已经介绍过线程同步与线程互斥技术,包括了原子锁,互斥体,事件和信号量。但是与海哥讲的线程同步与线程互斥技术不太一样,这篇文章来带领大家学习线程同步与线程互斥技术&#xff0c…

新手运行bert,pycharm不识别conda安装的python环境

提示No module named numpy/tensorflow conda list是有这些包的 pycharm识别不出interpreter的package 改成scripts下的python.exe就能识别出numpy和tensorflow了 改完interpreter之后出现过importerror: dll load failed,在environment variables里加了这些就不报错…

06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布

我们先看看画布的魅力&#xff1a; 初始画布 canvas默认是宽300px&#xff0c;高150px; 绘制步骤 1.定义一个id <canvas id"canvasOne" width"300" height"300"></canvas> 2.获取canvas对象 var canvasObj document.getEleme…

程序开发体系架构(C/S与B/S)

应用最多的网络应用程序开发体系结构可分为两种&#xff0c;一种是基于客户端/服务器&#xff08;Client/Server&#xff0c;C/S&#xff09;结构&#xff0c;另一种是基于浏览器/服务器&#xff08;Browser/Server&#xff0c;B/S&#xff09;架构 C/S体系结构 C/S是指在开发…