LuaJit交叉编译移植到ARM Linux

2023-10-16 06:45

本文主要是介绍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 - 博客园

交叉编译

源码下载后,解压:

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。

# 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里的安装目录:
Makefile
修改为指定的安装目录,然后执行安装命令:make install
安装目录下的文件结构:
编译结果
我们只需要把bin、lib下载到板子里,我这边是放在了/usr/local/下面。
这时就以执行luajit命令来测试下:

$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。修改如下:
Makefile修改
然后编译即可:

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的使用:

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"

运行:

luajit test_cjson.lua
输出:
John
30
郑州

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

这篇关于LuaJit交叉编译移植到ARM Linux的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219755

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave