LOVE2D项目绑定Rust MIDI控制器时遇lua_rawgetp未定义符号错误
解决LOVE2D中Rust mlua绑定出现
lua_rawgetp未定义符号错误 问题原因
lua_rawgetp是Lua 5.2及以上版本引入的API,而LOVE2D不同版本使用的Lua环境存在差异:
- 旧版LOVE(如0.10.x及更早)采用Lua 5.1
- 新版LOVE(0.11+)使用LuaJIT,对部分标准Lua 5.2+ API的支持有限
如果mlua编译时采用的Lua版本与LOVE的Lua环境不匹配,就会触发动态库符号找不到的错误。
解决方案
1. 确认LOVE2D的Lua版本
打开LOVE的控制台(按~键),执行:
print(_VERSION)
根据输出结果选择对应配置:
- 输出
Lua 5.1→ 对应mlua的lua51特性 - 输出
LuaJIT 2.0.x或类似 → 对应mlua的luajit特性
2. 调整Cargo.toml的mlua依赖配置
根据第一步的结果修改Cargo.toml:
- 若使用Lua 5.1:
[dependencies] mlua = { version = "0.9", features = ["lua51"] } - 若使用LuaJIT:
[dependencies] mlua = { version = "0.9", features = ["luajit"] }注意:mlua版本需对应,若使用mlua 0.10+,特性名称可能有调整,请查阅对应版本的官方文档。
3. (可选)链接LOVE自带的Lua库(更稳妥)
如果希望直接使用LOVE内置的Lua库,避免版本偏差:
- 添加build依赖:
[build-dependencies] pkg-config = "0.3" - 创建
build.rs文件,内容如下:fn main() { // 替换为LOVE对应的Lua版本,比如lua5.1 pkg_config::Config::new().probe("lua5.1").unwrap(); } - 修改mlua依赖,启用
system特性:[dependencies] mlua = { version = "0.9", features = ["lua51", "system"] }
4. 验证编译与兼容性
- 确保编译的动态库与LOVE的架构一致(如x86_64/arm64),跨架构会导致符号加载失败
- 使用
cargo build --release编译发布版本,避免debug版本的符号问题
5. 检查动态库符号
用以下命令查看库中是否包含lua_rawgetp:
nm -D ./lib/midi_input_handler/libmidi_input_handler.so | grep lua_rawgetp
如果无输出,说明编译时未引入该符号,回到第二步确认Lua版本配置是否正确。
内容的提问来源于stack exchange,提问作者CorentinVaillant
相关产品推荐
相关产品推荐

