LuaJit交叉编译移植到ARM Linux

简述

Lua与LuaJit的主要区别在于LuaJIT是基于JIT(Just-In-Time)技术开发的,可以实现动态编译和执行代码,从而提高了程序的运行效率。而Lua是基于解释器技术开发的,不能像LuaJIT那样进行代码的即时编译和执行。因此,在运行速度方面,LuaJIT要比Lua快得多。此外,LuaJIT还支持更多的操作系统和处理器架构,具有更广泛的适用性。但是,由于它引入了JIT技术,其实现复杂度更高,而且在一些特殊情况下,可能会存在性能问题。

这里选择LuaJit在嵌入式Linux系统使用,LuaJit交叉编译也比较简单,没有第三方库的依赖,直接交叉编译源码即可。

LuaJit移植-交叉编译

源码下载

LuaJit的官网:https://luajit.org/ ,发现官网上的链接好像下载不下来了,我把我这边用的源码上传到了码云,可以从这里下载:
https://gitee.com/fensnote/demo_code/blob/master/opensource/luajit/LuaJIT-2.0.5.tar.gz

有个LuaJit开发文档博客做的不错,可以参考下:
luajit开发文档中文版(二)LuaJIT扩展 - zh7314 - 博客园

交叉编译

源码下载后,解压:

bash 复制代码
tar xvzf LuaJit-2.0.5.tar.gz

上面那个博客中有详细的安装编译说明,这里主要引用了其ARM交叉编译的部分:

基于 GNU Makefile 的构建系统允许在任何主机上为任何受支持的目标进行交叉编译,只要两种架构具有相同的指针大小。如果您想在 x64 操作系统上交叉编译到任何 32 位目标,您需要安装 multilib 开发包(例如 Debian/Ubuntu 上的 libc6-dev-i386)并构建 32 位主机部分(HOST_CC="gcc - m32" )。
每当主机操作系统和目标操作系统不同时,您都需要指定TARGET_SYS,否则会出现汇编程序或链接器错误。例如,如果您在 Windows 或 macOS 主机上为嵌入式 Linux 或 Android 进行编译,则需要将TARGET_SYS=Linux添加到下面的示例中。对于最小的目标操作系统,您可能需要禁用src/Makefile中的内置分配器 并使用TARGET_SYS=Other。不要忘记为安装步骤指定相同的TARGET_SYS。

bash 复制代码
# Cross-compile to a 32 bit binary on a multilib x64 OS
make CC="gcc -m32"

# Cross-compile on Debian/Ubuntu for Windows (mingw32 package)
make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows
CROSS前缀允许指定标准 的GNU 交叉编译工具链(Binutils、GCC 和匹配的 libc)。前缀可能会因构建工具链 的--target不同而有所不同(注意CROSS前缀后面有一个"-")。下面的示例使用适用于 Linux 的规范工具链三元组。

由于在运行时通常没有简单的方法来检测 CPU 功能,因此使用正确的 CPU 或架构设置进行编译非常重要。您可以在自己构建工具链时指定这些。或将 -mcpu=...或-march=...添加到TARGET_CFLAGS。对于 ARM,拥有正确的-mfloat-abi=...设置也很重要。否则 LuaJIT 可能无法以目标 CPU 的全部性能运行。

# ARM soft-float
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
     TARGET_CFLAGS="-mfloat-abi=soft"

# ARM soft-float ABI with VFP (example for Cortex-A8)
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
     TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"

# ARM hard-float ABI with VFP (armhf, requires recent toolchain)
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-

# PPC
make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
# PPC/e500v2 (fast interpreter only)
make HOST_CC="gcc -m32" CROSS=powerpc-e500v2-linux-gnuspe-

# MIPS big-endian
make HOST_CC="gcc -m32" CROSS=mips-linux-
# MIPS little-endian
make HOST_CC="gcc -m32" CROSS=mipsel-linux-

编译还是挺顺利的,我这边编译了两种处理器的版本,没有出现什么错误。

编译好之后,可以修改Makefile里的安装目录:

修改为指定的安装目录,然后执行安装命令:make install

安装目录下的文件结构:

我们只需要把bin、lib下载到板子里,我这边是放在了/usr/local/下面。

这时就以执行luajit命令来测试下:

lua 复制代码
$luajit
LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
> print("hello luajit!")
hello luajit!
>

然后我们在编译个json的扩展库,json在实际开发中用的比较多,这里可以下载一个lua-cjson库进行交叉编译一下,源文件也在上面的码云链接里下载。

解压编译,cjson编译也比较简单,只需要改下编译器,修改一下lua头文件的路径,头文件路径即刚才安装LuaJit时的目录里的include。修改如下:

然后编译即可:

bash 复制代码
make CC=arm-none-linux-gcc 
arm-none-linux-gcc -c -O3 -Wall -pedantic -DNDEBUG  -I../install/include/luajit-2.0/ -fpic -o lua_cjson.o lua_cjson.c
arm-none-linux-gcc -c -O3 -Wall -pedantic -DNDEBUG  -I../install/include/luajit-2.0/ -fpic -o strbuf.o strbuf.c
arm-none-linux-gcc -c -O3 -Wall -pedantic -DNDEBUG  -I../install/include/luajit-2.0/ -fpic -o fpconv.o fpconv.c
arm-none-linux-gcc  -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o

文件比较少,编译完成后生成cjson.so,这个和平时Linux的动态库名字规则不太一样,前面不用"lib"开头。

然后这个cjson.so下载到: /usr/local/lib/lua/5.1

这样就完成了。

测试

测试下json的使用:

lua 复制代码
local cjson = require("cjson")

local json_str = '{"name":"John", "age":30, "city":"郑州"}'
local json_tab = cjson.decode(json_str)

print(json_tab.name)  -- 输出 "John"
print(json_tab.age)   -- 输出 30
print(json_tab.city)  -- 输出 "New York"

运行:

bash 复制代码
luajit test_cjson.lua
输出:
John
30
郑州

另外使用lua的table可以很方便的与json互转。

相关推荐
即将头秃的程序媛1 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin1 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天3 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º3 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。4 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert6 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风6 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子6 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka7 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器