最稳妥方式是源码编译安装:git clone镜像仓库,make编译,sudo make install部署;需装build-essential和libreadline-dev依赖,设LUAJIT_LIB与LUAJIT_INC环境变量,避免包管理器过时版本。

直接编译安装是最稳妥的选择
Linux 下安装 LuaJIT,别碰包管理器里的 luajit 包(Ubuntu/Debian 的 luajit 包早已过时且不带 FFI;CentOS/RHEL 甚至默认不提供),必须从源码编译。官方不发布预编译二进制,也不维护 distro 仓库包,这是设计使然——LuaJIT 构建高度依赖主机工具链和目标 ABI,硬打包反而容易出错。
实操建议:
- 用
git clone https://gitcode.com/gh_mirrors/lu/LuaJIT拉取最新镜像(官网原地址http://luajit.org/git/luajit-2.0.git在部分网络环境下不可靠) - 进入目录后直接运行
make—— 不要加make install一步到位,先验证能否编译成功 - 若报错
cc: command not found,说明没装 GCC:sudo apt install build-essential(Debian/Ubuntu)或sudo yum groupinstall "Development Tools"(RHEL/CentOS) - 若报错
readline/readline.h: No such file or directory,这不是 LuaJIT 的问题,而是系统缺少头文件:sudo apt install libreadline-dev(Debian/Ubuntu)或sudo yum install readline-devel(RHEL/CentOS)
安装路径与环境变量怎么设才不踩坑
默认 sudo make install 会把 luajit 二进制放到 /usr/local/bin,库文件到 /usr/local/lib。但很多 Lua C 模块(比如用 luarocks 装的)在加载时会查 LUAJIT_LIB 和 LUAJIT_INC 环境变量,漏设会导致 cannot open <module>: no such file or directory</module>。
正确做法:
- 安装后立即执行:
export LUAJIT_LIB=/usr/local/lib和export LUAJIT_INC=/usr/local/include/luajit-2.1(注意版本号是2.1,不是2.0,即使你编译的是 2.0.x 分支) - 把这两行加进
~/.bashrc或/etc/profile,然后source ~/.bashrc - 验证是否生效:
luajit -e "print(jit.version)"应输出类似LuaJIT 2.1.0-beta3;若报error loading module 'jit'...,就是LUAJIT_LIB没对上 - 不需要手动改
PATH—— 只要/usr/local/bin本身已在 PATH 中(绝大多数 Linux 发行版默认包含),luajit命令就能直接敲
交叉编译 ARM/Linux 设备时最常卡在哪
给嵌入式设备(如树莓派、ARM 开发板)交叉编译 LuaJIT,核心不是“能不能编”,而是“链接器找不找得到目标 libc 和汇编器”。常见失败现象是 as: unrecognized option '-mfloat-abi=hard' 或 undefined reference to `__aeabi_uidiv'。
关键控制点:
- 必须显式指定
CROSS前缀,例如make CROSS=arm-linux-gnueabihf-—— 注意末尾的短横线不能丢 - 如果目标系统是裸机或最小化 Linux(无 glibc),需加
TARGET_SYS=Linux(否则默认用POSIX,会链接错误符号) - 若提示
can't find crt1.o,说明CROSS工具链路径没进PATH,或者工具链不完整(缺 sysroot) - 不要用
HOST_CC="gcc -m32"这类参数去“模拟”交叉——它只适用于 x86_64 主机编 32 位 x86,对 ARM 完全无效 - 编译完检查生成的
src/luajit文件:用file src/luajit看是不是ARM aarch64或ARM, EABI5,而不是x86-64
和系统自带 lua5.1/lua5.3 共存要注意什么
LuaJIT 默认不兼容 Lua 5.2+ 的语法(比如 goto、::label:: 是支持的,但 table.unpack 行为不同),更麻烦的是头文件和库名冲突。如果你同时装了 lua5.1-dev 和 LuaJIT,C 扩展编译时可能误连系统 Lua 库,导致运行时报 symbol lookup error: undefined symbol: luaL_newstate。
安全共存策略:
- 用
pkg-config --modversion luajit和pkg-config --modversion lua5.1确认两者 pkgconfig 文件都存在且路径不重叠 - C 编译时显式指定头文件路径:
gcc -I/usr/local/include/luajit-2.1 ...,而不是依赖-llua—— 改用-lluajit-5.1 - 运行时避免
LD_LIBRARY_PATH同时包含/usr/lib和/usr/local/lib,优先级混乱会导致动态链接器加载错库 - 脚本里别混用
require "socket"(LuaSocket)和require "ffi"(LuaJIT FFI)在同一进程——前者可能依赖系统 Lua ABI,后者绑定 LuaJIT ABI,极大概率崩溃
Illegal instruction —— 这些几乎都源于 ABI 匹配被忽略,或环境变量指向了错误的头/库路径。



















