lua require module undefined symbol: lua_getmetatable
操作系统:Manjaro Linux
我用 https://github.com/khvzak/mlua 做了一个 lua module,lua 直接用可以用,但是放到 rime 里就报错。
lua 直接运行的结果
$ lua5.4 -e 'print(require("wordninja").split("iloverust"))'
i love rust
rime 中调用的代码
package.cpath = package.cpath .. ";/home/blindingdark/code/wordninja-rs-lua/wordninja.so"
require("wordninja").split(sentence)
rime 的报错日志
E0325 21:48:14.266957 505823 lua_gears.cc:15] LuaTranslation::Next error(2): error loading module 'wordninja' from file '/home/blindingdark/code/wordninja-rs-lua/wordninja.so':
/home/blindingdark/code/wordninja-rs-lua/wordninja.so: undefined symbol: lua_getmetatable
mlua 打包出来的 windows dll 直接放到程序目录也不行,不过把 lua53.dll 也放过去就可以正常工作了。 所以 linux 这边是怎么才能找到 lua so ?我试了往 package.cpath 里加 lua so 路径也不行。
rust 部分的代码在这里 https://github.com/BlindingDark/wordninja-rs-lua 编译的命令是
cargo build --release --features lua54
目前找到的办法是用 LD_PRELOAD 进行加载
LD_PRELOAD=/usr/lib/liblua.so fcitx5
librime-lua.so 需要以 RTLD_GLOBAL 模式载入(一般默认为RTLD_LOCAL),否则lua中不支持 import c module,现象就是找不到symbol。如果librime-lua 是由fcitx5载入的,需要看一下fcitx5有没有相关的选项可以调整。
Windows下的载入默认就是global的,并且lua代码已经在 rime.dll 中,不需要 lua53.dll。需要看一下mlua在制作lua module时有没有可能把 lua53.dll 的依赖改为 rime.dll。
wordjinja code很短 導入 lua table 不知可否 一個 載入字典 一個 split(tex)
如果有posix 能用 pipe3()