编译tolua——4、更新luaJit

news2025/2/1 15:36:18

目录
1、编译工具和环境说明
2、基础编译tolua
3、以pbc为例子,添加第三方库
4、更新luaJit

大家好,我是阿赵。
用tolua做项目的朋友们,在这两年肯定会遇到过一个问题,就是现在的安卓应用市场比如谷歌市场,要求上传的应用发布时都选择target api=30以上。然后用tolua的旧项目打包之后,发现在安卓11以上的手机上,会闪退,具体报错是lua初始化时的bad light userdata pointer。
这个问题的答案网上也有很多了,既然之前写了几篇编译tolua的文章,我这里也记录一下,方便以后查看。
这个问题的解决办法其实很简单,只需要去下载最新的LuaJIT库并替换到tolua里面,重新编译一次就可以了。

一、下载最新的LuaJit库

下载地址
在这里插入图片描述

看起来是一直还有人在维护的
在这里插入图片描述

下载下来对比一下,发现Copyright的时间也更新过了

二、复制替换文件

在这里插入图片描述

把下载到的文件解压之后,复制到tolua编译项目的luajit-2.1文件夹里面

三、尝试编译

admin@DESKTOP-DL702DH MINGW64 ~ $ cd /g/

admin@DESKTOP-DL702DH MINGW64 /g $ cd tolua

admin@DESKTOP-DL702DH MINGW64 /g/tolua $ dir android
build_win32.sh iOS luasocket struct.c bit.c
build_win32x.sh LICENSE macjit tolua.c build_arm.sh
build_win64.sh link_arm64.bat macnojit tolua.h build_arm64.sh
build_win64x.sh link_arm64x.bat pb.c ubuntu build_ios.sh
build_x86.sh lpeg.c pbc uint64.c build_osx.sh
cjson lpeg.h Plugins window build_ubuntu.sh
int64.c luajit-2.1 README.md

admin@DESKTOP-DL702DH MINGW64 /g/tolua $ ./build_win64x.sh
E:/Software/msys64/mingw64/bin/mingw32-make -C src clean
mingw32-make[1]: Entering directory ‘G:/tolua/luajit-2.1/src’ rm -f
luajit.exe libluajit.a lua51.dll host/minilua.exe host/buildvm.exe
lj_vm.S lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h
host/buildvm_arch.h jit/vmdef.lua .o host/.o *.obj *.lib *.exp *.dll
*.exe *.manifest *.pdb *.ilk mingw32-make[1]: Leaving directory ‘G:/tolua/luajit-2.1/src’
==== Building LuaJIT 2.1.0-beta3 ==== E:/Software/msys64/mingw64/bin/mingw32-make -C src mingw32-make[1]:
Entering directory ‘G:/tolua/luajit-2.1/src’ HOSTCC host/minilua.o
HOSTLINK host/minilua.exe DYNASM host/buildvm_arch.h HOSTCC
host/buildvm.o HOSTCC host/buildvm_asm.o HOSTCC
host/buildvm_peobj.o HOSTCC host/buildvm_lib.o HOSTCC
host/buildvm_fold.o HOSTLINK host/buildvm.exe BUILDVM lj_vm.o CC
lj_assert.o CC lj_gc.o BUILDVM lj_ffdef.h CC lj_err.o
CC lj_char.o BUILDVM lj_bcdef.h CC lj_bc.o CC
lj_obj.o CC lj_buf.o CC lj_str.o CC lj_tab.o CC
lj_func.o CC lj_udata.o CC lj_meta.o CC
lj_debug.o CC lj_prng.o CC lj_state.o CC
lj_dispatch.o CC lj_vmevent.o CC lj_vmmath.o CC
lj_strscan.o CC lj_strfmt.o CC lj_strfmt_num.o CC
lj_serialize.o CC lj_api.o CC lj_profile.o CC
lj_lex.o CC lj_parse.o CC lj_bcread.o CC
lj_bcwrite.o CC lj_load.o CC lj_ir.o CC
lj_opt_mem.o BUILDVM lj_folddef.h CC lj_opt_fold.o CC
lj_opt_narrow.o CC lj_opt_dce.o CC lj_opt_loop.o CC
lj_opt_split.o CC lj_opt_sink.o CC lj_mcode.o CC
lj_snap.o CC lj_record.o CC lj_crecord.o BUILDVM
lj_recdef.h CC lj_ffrecord.o CC lj_asm.o CC
lj_trace.o CC lj_gdbjit.o CC lj_ctype.o CC
lj_cdata.o CC lj_cconv.o CC lj_ccall.o CC
lj_ccallback.o CC lj_carith.o CC lj_clib.o CC
lj_cparse.o CC lj_lib.o CC lj_alloc.o CC
lib_aux.o BUILDVM lj_libdef.h CC lib_base.o CC
lib_math.o CC lib_bit.o CC lib_string.o CC
lib_table.o CC lib_io.o CC lib_os.o CC
lib_package.o CC lib_debug.o CC lib_jit.o CC
lib_ffi.o CC lib_buffer.o CC lib_init.o AR
libluajit.a CC luajit.o BUILDVM jit/vmdef.lua LINK
luajit.exe OK Successfully built LuaJIT mingw32-make[1]:
Leaving directory ‘G:/tolua/luajit-2.1/src’
==== Successfully built LuaJIT 2.1.0-beta3 ==== E:/Software/msys64/mingw64/bin/mingw32-make -C src clean
mingw32-make[1]: Entering directory ‘G:/tolua/luajit-2.1/src’ rm -f
luajit.exe libluajit.a lua51.dll host/minilua.exe host/buildvm.exe
lj_vm.S lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h
host/buildvm_arch.h jit/vmdef.lua .o host/.o *.obj *.lib *.exp *.dll
*.exe *.manifest *.pdb *.ilk mingw32-make[1]: Leaving directory ‘G:/tolua/luajit-2.1/src’ tolua.c: In function ‘tolua_getvec2’:
tolua.c:114:2: warning: implicit declaration of function ‘lua_getref’
[-Wimplicit-function-declaration] lua_getref(L,
LUA_RIDX_UNPACKVEC2); ^ int64.c: In function ‘_isint64’:
int64.c:43:9: warning: implicit declaration of function ‘lua_getref’
[-Wimplicit-function-declaration]
lua_getref(L, LUA_RIDX_INT64);
^ uint64.c: In function ‘_isuint64’: uint64.c:43:9: warning: implicit declaration of function ‘lua_getref’
[-Wimplicit-function-declaration]
lua_getref(L, LUA_RIDX_UINT64);
^ pbc/binding/lua/pbc-lua.c:35:0: warning: “luaL_newlib” redefined #define luaL_newlib(L ,reg)
luaL_register(L,“protobuf.c”,reg) ^ In file included from
pbc/binding/lua/pbc-lua.c:6:0: luajit-2.1/src/lauxlib.h:125:0: note:
this is the location of the previous definition #define
luaL_newlib(L, l) (luaL_newlibtable(L, l), luaL_setfuncs(L, l, 0)) ^
E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x17e): undefined
reference to lua_getref' E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x215): undefined reference to lua_getref’
E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x2a6): undefined
reference to lua_getref' E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x12a2): undefined reference to lua_getref’
E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x18b3): undefined
reference to lua_getref' E:\Software\msys64\tmp\ccr9bONS.o:tolua.c:(.text+0x193b): more undefined references to lua_getref’ follow collect2.exe: error: ld
returned 1 exit status

尝试编译一下,发现有错误,没有编译成功。

四、解决

因为报错undefined reference to `lua_getref’,证明lua_getref方法没有定义,找到旧版本的luajit搜索一下,发现之前是在luajit-2.1/src/lauxlib.h最后定义的

#define lua_unref(L,ref)        luaL_unref(L, LUA_REGISTRYINDEX, (ref))
#define lua_getref(L,ref)       lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))

把这个添加到新复制进去的luajit对应文件里面,编译就通过了。

五、总结

通过解决这个错误,实际我们可以得出一些经验的。
虽然我们是在命令行编译,但实际上每一个命令的运行过程和结果都有在控制台输出。所以如果发现编译不成功,不要紧张,不要惊慌,我们应该仔细的分析一下打印输出,看具体是哪里有问题。
一般来说有几种可能:

1、工具或者编译的路径没指定
2、使用的编译版本不对,比如ndk不同版本的gcc问题
3、没有指定源码目录,导致文件include的时候找不到
4、某些需要使用的代码没有定义,具体看看报错是什么地方没定义,加上继续
5、某些代码重复定义,这个可以具体看看报错,比如某些方法在两个第三方库里面都提供了,导致重复了,这些一般在输出的报错里面都有具体重复的方法名,可以文件夹搜索,找出重复的方法并看情况删除其中一个
6、添加的源码有错误,导致编译不过。比如某个.c文件有编译不过地方,一般在输出的报错里面都有说明文件名和行号,可以具体的去分析一下源码是否有错误。

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

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

相关文章

Linux知识点 -- 进程控制(一)

Linux知识点 – 进程控制(一) 文章目录 Linux知识点 -- 进程控制(一)一、进程创建1.fork函数2.写时拷贝2.fork常规用法3.fork调用失败的原因 二、进程终止1.进程终止时操作系统的行动2.进程终止的常见方式3.用代码终止一个进程 三…

yolo-v3看不懂?手撕代码逐行讲解,附带网盘完整代码实现

目录 一:读取数据 二:初始化模型 Route 层用于将来自不同层的特征图进行连接或拼接。 Shortcut 层用于执行残差连接,将前一层的特征图与当前层的特征图相加。 最重要的一层 yolo层: 三:初始化完所有有网络层后&…

从零开始,5分钟轻松实现Spring Boot与RabbitMQ的无缝集成

🌏 环境 docker v4.16.2springboot 2.7.0RabbitMQ 3.9.1 rabbitmq_delayed_message_exchange 3.9.0 ps:代码地址 gitee 🪜 服务架构 使用maven多模块,将生产者、消费者分别以springboot项目启动,两者通过RabbitMQ…

【Spark基础编程】 第8章 Spark MLlib

系列文章目录 文章目录 系列文章目录前言【 第8章 Spark MLlib 】8.1 Spark MLlib简介8.1.1 什么是机器学习8.1.2 基于大数据的机器学习8.1.3 Spark 机器学习库MLLib 8.2 机器学习工作流8.2.1 机器学习流水线概念8.2.2 构建一个机器学习流水线 8.3 特征抽取、转化和选择8.4 分类…

【DBA日常工作职责---读书笔记】

👈【上一篇】 💖The Begin💖点点关注,收藏不迷路💖 【下一篇】👉 🔻DBA 的工作职责是什么?每天 DBA 应该做哪些工作?稳定环境中的 DBA 该如何成长与 优化&#xff1…

Jmeter插件PerfMon Metrics Collector安装使用及报错解决

Jmeter作为一个轻量级的性能测试工具,开源、小巧、灵活的特性使其越来越受到测试人员喜爱。在实际的项目中,特别是跨地区项目,排除合作方指定要求使用Loadrunner作为性能测试工具外,Jmeter会是首选。 本篇文章,就着重…

华为云DevCloud平台部署bootdo博客论坛实战【开发者专属集市】

华为云DevCloud平台部署bootdo博客论坛实战【开发者专属集市】 一、bootdo-blog开源博客介绍二、本次实践所用工具及平台三、购买华为RDS数据库1.购买RDS数据库2.查看RDS数据库状态 四、创建项目1.登录华为云台DevCloud平台2.新建项目3.查看新建项目4.创建代码仓库 五、配置数据…

老话新谈之缓存一致性

前言 缓存一致性常见的更新策略也比较多,如先更新数据库再更新缓存,先删缓存再更新数据库等等,我在理解的时候有些混乱,所以这个文章提供了一些理解上的技巧去理解缓存一致性。 为什么会有缓存一致性的问题 缓存与数据库是两套…

网络安全从业人员2023年后真的会被AI取代吗?

随着ChatGPT的火爆,很多人开始担心网络安全从业人员会被AI取代。如果说网络安全挖洞的话,AI可能真的能取代。但是网络安全不仅仅只是挖洞,所以AI只是能缓解网络安全人员不足的情况,但是是不会取代人类的作用的。 就拿最近很火的C…

【STL】priority_queue的使用及模拟实现

目录 前言 priority_queue的使用 功能解析 基本接口 写点题目 模拟实现 结构解析 插入删除 调整函数结合仿函数 仿函数介绍 结合使用 其他功能 接口补齐 迭代器区间构造 前言 🍾打开 queue 头文件后,我们发现除了我们之前介绍过的普通队列…

用maven安装JUnit 5并运行单元测试

一&#xff1a;首先讲如何安装 JUnit 5 JUnit Platform JUnit Jupiter JUnit Vintage 如果不需要执行基于JUnit 3 和JUnit 4 的用例&#xff0c;那么JUnit Vintage就不需要安装。 1&#xff09;在pom文件dependencies的小节内增加如下依赖&#xff1a; <dependency>&l…

Docker安装ClickHouse22.6.9.11并与SpringBoot、MyBatisPlus集成

背景 上一篇文章CentOS6.10上离线安装ClickHouse19.9.5.36并修改默认数据存储目录记录了在旧版的操作系统上直接安装低版本 ClickHouse &#xff08;脱胎于俄罗斯头号搜索引擎的技术&#xff09;的过程&#xff0c;开启远程访问并配置密码&#xff1b; 其实通过 Docker 运行 …

一文读懂性能测试

01、常见概念 吞吐量&#xff08;TPS, QPS&#xff09; 简单来说就是每秒钟完成的事务数或者查询数。通常吞吐量大表明系统单位时间能处理的请求数越多&#xff0c;所以通常希望TPS越高越好 响应时间 即从请求发出去到收到系统返回的时间。响应时间一般不取平均值&#xff0…

二叉树及其链式结构

目录 一&#xff1a;树概念及结构 1.树的概念 2.树的相关概念 3.树的表示 二&#xff1a;二叉树的概念及结构 1.概念 2.特殊的二叉树 <1>. 满二叉树&#xff1a; <2>. 完全二叉树&#xff1a; 3.二叉树的性质 4.二叉树的存储结构 <1>.顺序结构 <…

win11 无法登录微软账户 终极解决方案

背景&#xff1a;win11突然无法登录微软账户&#xff0c;office无法激活&#xff0c;Edge里的微软账户也无法登录&#xff0c;反馈中心也无法打开等&#xff0c;有网络&#xff0c;浏览器可以访问微软并进行登录。 试过网上的网络配置&#xff08;SSL及TLS协议勾选&#xff09…

数学模型:Python实现线性规划

文章摘要&#xff1a;线性规划的Python实现。 参考书籍&#xff1a;数学建模算法与应用(第3版)司守奎 孙玺菁。 PS&#xff1a;只涉及了具体实现并不涉及底层理论。学习底层理论以及底层理论实现&#xff1a;可以参考1.最优化模型与算法——基于Python实现 渐令 粱锡军2.算法导…

vim复制,剪切觉得麻烦?今天就来教会你:vim复制和剪切教程

上次讲了vim移动光标的快捷键&#xff0c;今天我们来了解一下vim的复制多行的功能。 快速复制多行 第一步&#xff1a;将光标移动到复制的文本开始的地方&#xff0c;按下v进入可视模式&#xff0c;这里的v的意思就是visual的缩写&#xff0c;就是可视的意思。 第二步&#x…

DBSCAN 集群

目录 DBSCAN 集群 主要代码 DBSCAN 绘制结果中的集群 DBSCAN 集群 基于密度的空间聚类应用&#xff08;DBSCAN&#xff09;是一种基于密度的聚类算法&#xff0c;由Martin Ester等人在1996年提出。该算法在半径为ε的圆内找到数据点的相邻点&#xff0c;并将它们加入到同一…

Git原理详解+指令操作,带你快速掌握Git

一、相关概念 版本控制 什么是版本控制&#xff1f; 用于管理多人协同开发项目的技术对文件的版本控制&#xff0c;要对文件进行修改、提交等操作 版本控制的分类 1.本地版本控制 就是放在本地 2.集中版本控制 SVN 所有的版本数据都保存在服务器上&#xff0c;协同开发…

GDAL读取属性表值乱码解决方法

文章目录 方法1&#xff1a;方法2&#xff1a;1.通过在线网网站&#xff0c;查看编码2.参考C中gbk和utf8互相转换文章 gdal示例代码 方法1&#xff1a; 在网上查看的推荐方法&#xff08;C代码&#xff09;&#xff0c;但没解决我遇到的问题&#xff1b; CPLSetConfigOption(&…