lua交叉编译

获取源码

curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5

修改Makefile

修改安装路径

vi Makefile

INSTALL_TOP= /usr/local

改为

INSTALL_TOP= 自定义安装路径

修改编译配置

注意只修改它表明可以修改的位置
vi src/Makefile

# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================

# Your platform. See PLATS for possible values.
PLAT= none

CC= gcc -std=gnu99
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS) 

AR= ar rcu
RANLIB= ranlib
RM= rm -f

SYSCFLAGS=
SYSLDFLAGS=
SYSLIBS=

MYCFLAGS=
MYLDFLAGS=
MYLIBS=
MYOBJS=

# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======

修改后

# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================

# Your platform. See PLATS for possible values.
PLAT= none

CC= powerpc-linux-gcc -std=gnu99
CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS) 

AR= powerpc-linux-ar rcu
RANLIB= powerpc-linux-ranlib
RM= rm -f

SYSCFLAGS=
SYSLDFLAGS=
SYSLIBS=

MYCFLAGS=
MYLDFLAGS=
MYLIBS=
MYOBJS=

# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======

安装

修改完成后执行

make linux 
make install

安装后的安装目录

├── bin
│   ├── lua
│   └── luac
├── include
│   ├── lauxlib.h
│   ├── luaconf.h
│   ├── lua.h
│   ├── lua.hpp
│   └── lualib.h
├── lib
│   ├── liblua.a
│   └── lua
│       └── 5.3
├── man
│   └── man1
│       ├── lua.1
│       └── luac.1
└── share
    └── lua
        └── 5.3

拷贝到开发板上即可

 测试:

开发板上运行

chmod +x lua
./lua -v
echo "print(\"hello lua\")" | ./lua 

注意

make test不能在PC上执行,因为是交叉编译的所以无法执行测试

可能遇到缺少库的问题,不过通常都能在交叉编译器的路径中找到,拷贝到板子上就行

要将 **Lua 5.4.6** 成功交叉编译并集成到 **OpenWrt** 系统中(如路由器),必须使用 OpenWrt 的 SDK 进行 **交叉编译(cross-compilation)**,因为你不能在 x86_64 PC 上直接编译出能在 ARM/MIPS 架构的路由器上运行的二进制文件。 以下是详细、可操作的步骤来完成这个过程: --- ## ✅ 目标 - 将 Lua 5.4.6 编译为适用于 OpenWrt 路由器的可执行程序和库 - 支持 `string.pack` / `string.unpack`(需要 Lua 5.3+) - 可部署为 `.ipk` 包或手动复制到设备 --- ## 📦 准备工作 ### 1. 下载 OpenWrt SDK(匹配你的固件版本) > 示例:假设你使用的是 `23.05.3` 版本,架构为 `mipsel_24kc` ```bash wget https://downloads.openwrt.org/releases/23.05.3/targets/ramips/mt76x8/openwrt-sdk-23.05.3-ramips-mt76x8_gcc-12.3.0_musl.Linux-x86_64.tar.xz tar -Jxvf openwrt-sdk-*.tar.xz cd openwrt-sdk-* ``` > 🔍 查找合适 SDK: > https://downloads.openwrt.org/releases/ 你可以通过以下命令查看当前路由器信息: ```bash uname -a # 查看内核 opkg print-architecture # 查看 opkg 架构 cat /proc/cpuinfo # 查看 CPU 架构 ``` --- ### 2. 下载 Lua 5.4.6 源码 ```bash wget https://www.lua.org/ftp/lua-5.4.6.tar.gz tar -zxvf lua-5.4.6.tar.gz cd lua-5.4.6 ``` --- ## 🔧 配置交叉编译环境 我们需要修改 Lua 的 `Makefile`,使其使用 OpenWrt 提供的交叉工具链。 ### 1. 设置环境变量(指向 SDK 工具链) ```bash # 根据你的 SDK 路径调整 export OPENWRT_SDK=$HOME/openwrt-sdk-23.05.3-ramips-mt76x8_gcc-12.3.0_musl export STAGING_DIR=$OPENWRT_SDK/staging_dir export PATH=$STAGING_DIR/toolchain-mipsel_24kc_gcc-12.3.0_musl/bin:$PATH # 设置交叉编译器 export CC=mipsel-openwrt-linux-musl-gcc export AR="$CC -ar rcu" export RANLIB=mipsel-openwrt-linux-musl-ranlib export LD=mipsel-openwrt-linux-musl-ld ``` > 💡 注意:`mipsel` 是小端 MIPS;如果你是 `arm`, `aarch64`, `x86_64`,请替换相应前缀。 --- ### 2. 修改 `src/Makefile` 编辑 `lua-5.4.6/src/Makefile`,做如下修改: #### a. 更改 `MYCFLAGS` 添加目标定义 ```makefile MYCFLAGS= -DLUA_USE_LINUX -DLUA_USE_POSIX -I$OPENWRT_SDK/staging_dir/target-mipsel_24kc_musl/usr/include ``` #### b. 更改 `MYLDFLAGS`(可选) ```makefile MYLDFLAGS= -L$OPENWRT_SDK/staging_dir/target-mipsel_24kc_musl/usr/lib ``` #### c. 修改 `CC`, `AR`, `RANLIB`(或者用上面 export 的方式控制) 可以保留原样,因为我们已经通过 shell 导出了这些变量。 --- ### 3. 修改 `src/luaconf.h`(重要!防止 readline 错误) Lua 默认依赖 `readline`,但 OpenWrt 通常没有它。禁用交互式特性。 找到这一行: ```c #define LUA_USE_READLINE ``` 注释掉: ```c /* #define LUA_USE_READLINE */ ``` 否则会报错:`readline/readline.h: No such file or directory` --- ## 🛠️ 开始交叉编译 返回 `src/` 目录并执行: ```bash cd src make clean make posix CC=$CC AR="$AR" RANLIB=$RANLIB MYCFLAGS="-DLUA_USE_POSIX" MYLIBS="-lm -ldl" ``` ✅ 成功后你会得到两个关键文件: - `lua` —— 解释器(可在路由器运行) - `luac` —— 编译器 如果你想构建共享库(`.so`),还需要额外配置。 --- ## 📁 部署到 OpenWrt 路由器 ### 方法一:直接拷贝运行 ```bash scp lua root@192.168.1.1:/tmp/ ssh root@192.168.1.1 mv /tmp/lua /usr/bin/lua5.4 chmod +x /usr/bin/lua5.4 ``` 测试: ```bash lua5.4 -v # 输出:Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio ``` ### 方法二:制作 `.ipk` 包(推荐用于发布) 创建一个标准 OpenWrt package 结构。 #### 1. 创建目录结构 ```bash mkdir -p lua-openwrt/package/Makefile ``` #### 2. 写入 `package/Makefile` ```makefile include $(TOPDIR)/rules.mk PKG_NAME := lua PKG_VERSION := 5.4.6 PKG_RELEASE := 1 PKG_SOURCE := lua-$(PKG_VERSION).tar.gz PKG_SOURCE_URL := https://www.lua.org/ftp PKG_HASH := d9e3e8fc8ff29c7a409d8c7ded1a73fb8b350c83888ce7ed5099d965faca87c1 PKG_BUILD_DIR := $(BUILD_DIR)/lua-$(PKG_VERSION) include $(INCLUDE_DIR)/package.mk define Package/lua SECTION := lang CATEGORY := Languages TITLE := Lua 5.4.6 Scripting Language URL := https://www.lua.org/ endef define Package/lua/description A lightweight, embeddable scripting language. Supports string.pack/string.unpack for binary data. endef define Build/Prepare $(call Build/Prepare/Default) endef define Build/Configure $(SED) 's/#define LUA_USE_READLINE/\/\/#define LUA_USE_READLINE/' $(PKG_BUILD_DIR)/src/luaconf.h endef define Build/Compile CROSS=$(TARGET_CROSS) \ CC="$(TARGET_CC)" \ AR="$(TARGET_CC) -ar rcu" \ RANLIB="$(TARGET_CROSS)ranlib" \ MYCFLAGS="-DLUA_USE_LINUX -DLUA_USE_POSIX" \ MYLIBS="-lm -ldl" \ $(MAKE) -C $(PKG_BUILD_DIR) posix endef define Package/lua/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/lua $(1)/usr/bin/lua5.4 $(INSTALL_DIR) $(1)/usr/share/lua/5.4 endef $(eval $(call BuildPackage,lua)) ``` #### 3. 构建 `.ipk` ```bash cp -r package $OPENWRT_SDK/ cd $OPENWRT_SDK make package/lua/{clean,compile} V=s ``` 生成的包位于: ``` bin/packages/mipsel_24kc/base/lua_5.4.6-1_mipsel_24kc.ipk ``` #### 4. 安装到路由器 ```bash scp bin/packages/.../lua_5.4.6-1_*.ipk root@192.168.1.1:/tmp/ ssh root@192.168.1.1 opkg install /tmp/lua_5.4.6-1_*.ipk ``` --- ## ✅ 测试功能(验证 `string.pack`) 在路由器上运行: ```lua -- test.lua local buf = string.pack(">i4 z", 100, "hello") print("Length:", #buf) for i = 1, #buf do io.stdout:write(string.format("%02X ", buf:byte(i))) end print() ``` 运行: ```bash lua5.4 test.lua ``` 输出应类似: ``` Length: 10 00 00 00 64 68 65 6C 6C 6F 00 ``` 说明成功支持二进制打包! --- ## ⚠️ 常见问题与解决方案 | 问题 | 原因 | 解决方法 | |------|------|----------| | `readline.h not found` | 缺少 readline 开发库 | 注释 `LUA_USE_READLINE` | | `undefined reference to 'dlopen'` | 缺少 `-ldl` | 添加 `MYLIBS=-lm -ldl` | | 编译后无法运行 | 架构不匹配 | 确保使用正确的 SDK 和 `CC` 前缀 | | 启动时报错 `not found` | 动态链接库缺失 | 使用 `LD_LIBRARY_PATH` 或静态编译 | --- ## ✅ 可选:静态编译(避免依赖) 添加 `-static` 防止运行时找不到 musl 库: ```bash make posix CC=$CC CFLAGS="-static -DLUA_USE_LINUX" MYLIBS="-lm -ldl -static" ``` 这样生成的 `lua` 是完全静态的,可以直接运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值