LuaJit交叉编译移植到ARM Linux
来源:与非网发布时间:2023-10-162063浏览
询问 AILua与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开发文档中文版https://www.cnblogs.com/zx-admin/p/16363426.html
交叉编译
源码下载后,解压:
tarxvzfLuaJit-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-compiletoa32bitbinaryonamultilibx64OSmakeCC="gcc-m32"#Cross-compileonDebian/UbuntuforWindows(mingw32package)makeHOST_CC="gcc-m32"CROSS=i586-mingw32msvc-TARGET_SYS=WindowsCROSS前缀允许指定标准的GNU 交叉编译工具链(Binutils、GCC 和匹配的 libc)。前缀可能会因构建工具链的--target不同而有所不同(注意CROSS前缀后面有一个"-")。下面的示例使用适用于 Linux 的规范工具链三元组。由于在运行时通常没有简单的方法来检测 CPU 功能,因此使用正确的 CPU 或架构设置进行编译非常重要。您可以在自己构建工具链时指定这些。或将-mcpu=...或-march=...添加到TARGET_CFLAGS。对于 ARM,拥有正确的-mfloat-abi=...设置也很重要。否则 LuaJIT 可能无法以目标 CPU 的全部性能运行。#ARMsoft-floatmakeHOST_CC="gcc-m32"CROSS=arm-linux-gnueabi-TARGET_CFLAGS="-mfloat-abi=soft"#ARMsoft-floatABIwithVFP(exampleforCortex-A8)makeHOST_CC="gcc-m32"CROSS=arm-linux-gnueabi-TARGET_CFLAGS="-mcpu=cortex-a8-mfloat-abi=softfp"#ARMhard-floatABIwithVFP(armhf,requiresrecenttoolchain)makeHOST_CC="gcc-m32"CROSS=arm-linux-gnueabihf-#PPCmakeHOST_CC="gcc-m32"CROSS=powerpc-linux-gnu-#PPC/e500v2(fastinterpreteronly)makeHOST_CC="gcc-m32"CROSS=powerpc-e500v2-linux-gnuspe-#MIPSbig-endianmakeHOST_CC="gcc-m32"CROSS=mips-linux-#MIPSlittle-endianmakeHOST_CC="gcc-m32"CROSS=mipsel-linux-编译还是挺顺利的,我这边编译了两种处理器的版本,没有出现什么错误。编译好之后,可以修改Makefile里的安装目录:
Makefile
修改为指定的安装目录,然后执行安装命令:make install 安装目录下的文件结构:
编译结果
我们只需要把bin、lib下载到板子里,我这边是放在了/usr/local/下面。这时就以执行luajit命令来测试下:
$luajitLuaJIT2.0.5--Copyright(C)2005-2017MikePall.http://luajit.org/JIT:ONCMOVSSE2SSE3SSE4.1foldcsedcefwddsenarrowloopabcsinkfuse>print("helloluajit!")helloluajit!>然后我们在编译个json的扩展库,json在实际开发中用的比较多,这里可以下载一个lua-cjson库进行交叉编译一下,源文件也在上面的码云链接里下载。
解压编译,cjson编译也比较简单,只需要改下编译器,修改一下lua头文件的路径,头文件路径即刚才安装LuaJit时的目录里的include。修改如下:
Makefile修改
然后编译即可:
makeCC=arm-none-linux-gccarm-none-linux-gcc-c-O3-Wall-pedantic-DNDEBUG-I../install/include/luajit-2.0/-fpic-olua_cjson.olua_cjson.carm-none-linux-gcc-c-O3-Wall-pedantic-DNDEBUG-I../install/include/luajit-2.0/-fpic-ostrbuf.ostrbuf.carm-none-linux-gcc-c-O3-Wall-pedantic-DNDEBUG-I../install/include/luajit-2.0/-fpic-ofpconv.ofpconv.carm-none-linux-gcc-shared-ocjson.solua_cjson.ostrbuf.ofpconv.o文件比较少,编译完成后生成cjson.so,这个和平时Linux的动态库名字规则不太一样,前面不用“lib”开头。
然后这个cjson.so下载到: /usr/local/lib/lua/5.1 这样就完成了。
测试
测试下json的使用:
localcjson=require("cjson")localjson_str='{"name":"John","age":30,"city":"郑州"}'localjson_tab=cjson.decode(json_str)print(json_tab.name)--输出"John"print(json_tab.age)--输出30print(json_tab.city)--输出"NewYork"运行:
luajittest_cjson.lua输出:John30郑州另外使用lua的table可以很方便的与json互转。
引用链接
[1]luajit开发文档中文版(二)LuaJIT扩展 - zh7314 - 博客园:https://www.cnblogs.com/zx-admin/p/16363431.html
新闻来源:与非网,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。