加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LuaJit交叉編譯移植到ARM Linux

2023/10/16
2720
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

Lua與LuaJit的主要區(qū)別在于LuaJIT是基于JIT(Just-In-Time)技術(shù)開(kāi)發(fā)的,可以實(shí)現(xiàn)動(dòng)態(tài)編譯和執(zhí)行代碼,從而提高了程序的運(yùn)行效率。而Lua是基于解釋器技術(shù)開(kāi)發(fā)的,不能像LuaJIT那樣進(jìn)行代碼的即時(shí)編譯和執(zhí)行。因此,在運(yùn)行速度方面,LuaJIT要比Lua快得多。此外,LuaJIT還支持更多的操作系統(tǒng)和處理器架構(gòu),具有更廣泛的適用性。但是,由于它引入了JIT技術(shù),其實(shí)現(xiàn)復(fù)雜度更高,而且在一些特殊情況下,可能會(huì)存在性能問(wèn)題。

這里選擇LuaJit在嵌入式Linux系統(tǒng)使用,LuaJit交叉編譯也比較簡(jiǎn)單,沒(méi)有第三方庫(kù)的依賴,直接交叉編譯源碼即可。

LuaJit移植-交叉編譯

源碼下載

LuaJit的官網(wǎng):https://luajit.org/ ,發(fā)現(xiàn)官網(wǎng)上的鏈接好像下載不下來(lái)了,我把我這邊用的源碼上傳到了碼云,可以從這里下載:https://gitee.com/fensnote/demo_code/blob/master/opensource/luajit/LuaJIT-2.0.5.tar.gz。

有個(gè)LuaJit開(kāi)發(fā)文檔博客做的不錯(cuò),可以參考下:?luajit開(kāi)發(fā)文檔中文版https://www.cnblogs.com/zx-admin/p/16363426.html

交叉編譯

源碼下載后,解壓:

tar?xvzf?LuaJit-2.0.5.tar.gz

上面那個(gè)博客中有詳細(xì)的安裝編譯說(shuō)明,這里主要引用了其ARM交叉編譯的部分:

基于 GNU Makefile 的構(gòu)建系統(tǒng)允許在任何主機(jī)上為任何受支持的目標(biāo)進(jìn)行交叉編譯,只要兩種架構(gòu)具有相同的指針大小。如果您想在 x64 操作系統(tǒng)上交叉編譯到任何 32 位目標(biāo),您需要安裝 multilib 開(kāi)發(fā)包(例如 Debian/Ubuntu 上的 libc6-dev-i386)并構(gòu)建 32 位主機(jī)部分(HOST_CC="gcc - m32" )。

每當(dāng)主機(jī)操作系統(tǒng)和目標(biāo)操作系統(tǒng)不同時(shí),您都需要指定TARGET_SYS,否則會(huì)出現(xiàn)匯編程序或鏈接器錯(cuò)誤。例如,如果您在 Windows 或 macOS 主機(jī)上為嵌入式 Linux 或 Android 進(jìn)行編譯,則需要將TARGET_SYS=Linux添加到下面的示例中。對(duì)于最小的目標(biāo)操作系統(tǒng),您可能需要禁用src/Makefile中的內(nèi)置分配器 并使用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前綴允許指定標(biāo)準(zhǔn)?的GNU 交叉編譯工具鏈(Binutils、GCC 和匹配的 libc)。前綴可能會(huì)因構(gòu)建工具鏈?的--target不同而有所不同(注意CROSS前綴后面有一個(gè)"-")。下面的示例使用適用于 Linux 的規(guī)范工具鏈三元組。

由于在運(yùn)行時(shí)通常沒(méi)有簡(jiǎn)單的方法來(lái)檢測(cè) CPU 功能,因此使用正確的 CPU 或架構(gòu)設(shè)置進(jìn)行編譯非常重要。您可以在自己構(gòu)建工具鏈時(shí)指定這些?;?qū)?-mcpu=...或-march=...添加到TARGET_CFLAGS。對(duì)于 ARM,擁有正確的-mfloat-abi=...設(shè)置也很重要。否則 LuaJIT 可能無(wú)法以目標(biāo) CPU 的全部性能運(yùn)行。

#?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-

編譯還是挺順利的,我這邊編譯了兩種處理器的版本,沒(méi)有出現(xiàn)什么錯(cuò)誤。編譯好之后,可以修改Makefile里的安裝目錄:

Makefile

修改為指定的安裝目錄,然后執(zhí)行安裝命令:make install 安裝目錄下的文件結(jié)構(gòu):

編譯結(jié)果

我們只需要把bin、lib下載到板子里,我這邊是放在了/usr/local/下面。這時(shí)就以執(zhí)行l(wèi)uajit命令來(lái)測(cè)試下:

$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!
>

然后我們?cè)诰幾g個(gè)json的擴(kuò)展庫(kù),json在實(shí)際開(kāi)發(fā)中用的比較多,這里可以下載一個(gè)lua-cjson庫(kù)進(jìn)行交叉編譯一下,源文件也在上面的碼云鏈接里下載。

解壓編譯,cjson編譯也比較簡(jiǎn)單,只需要改下編譯器,修改一下lua頭文件的路徑,頭文件路徑即剛才安裝LuaJit時(shí)的目錄里的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,這個(gè)和平時(shí)Linux的動(dòng)態(tài)庫(kù)名字規(guī)則不太一樣,前面不用“l(fā)ib”開(kāi)頭。

然后這個(gè)cjson.so下載到: /usr/local/lib/lua/5.1 這樣就完成了。

測(cè)試

測(cè)試下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"

運(yùn)行:

luajit?test_cjson.lua
輸出:
John
30
鄭州

另外使用lua的table可以很方便的與json互轉(zhuǎn)。

引用鏈接

[1]?luajit開(kāi)發(fā)文檔中文版(二)LuaJIT擴(kuò)展 - zh7314 - 博客園:?https://www.cnblogs.com/zx-admin/p/16363431.html

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
MX25L3233FM2I-08G 1 Macronix International Co Ltd Flash, 8MX4, PDSO8, SOP-8
$0.82 查看
HFBR-2412Z 1 Broadcom Limited Receiver, 5Mbps, ST Connector, Through Hole Mount, ROHS COMPLIANT, PLASTIC, 8 PIN
$31.76 查看
ASDMB-8.000MHZ-LC-T 1 Abracon Corporation MEMS OSC XO 8.0000MHZ LVCMOS SMD

ECAD模型

下載ECAD模型
$2.68 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

專注嵌入式Linux應(yīng)用開(kāi)發(fā),C/C++技術(shù)交流;Qt編程技術(shù)交流。