Lua 5.3加载lua-cjson报错:Symbol not found: _lua_objlen求解
解决Lua 5.3下lua-cjson加载时
_lua_objlen符号缺失的问题 这个错误的核心原因很明确:你当前使用的lua-cjson版本不兼容Lua 5.3。Lua 5.3移除了_lua_objlen这个C API符号,而旧版lua-cjson仍在调用它,导致动态库加载失败。下面是几种可行的解决办法:
方法一:升级到兼容Lua 5.3的lua-cjson版本
官方原版的lua-cjson已经停止维护,不再支持Lua 5.3,但社区有维护的分支适配了新版本Lua。你可以按以下步骤操作:
- 先卸载旧版lua-cjson:
- 如果是通过包管理器安装的,用对应命令卸载(比如
brew uninstall lua-cjson或apt remove lua-cjson) - 如果是源码编译安装的,进入原源码目录执行
make uninstall
- 如果是通过包管理器安装的,用对应命令卸载(比如
- 获取兼容Lua 5.3的lua-cjson源码,编译安装:
# 假设你已经拿到适配5.3的源码 make clean # 指定Lua 5.3的头文件和库路径(根据你的实际安装路径调整) make LUA_INCLUDE_DIR=/usr/local/include/lua5.3 LUA_LIB_DIR=/usr/local/lib/lua5.3 make install
方法二:手动修改源码适配Lua 5.3
如果你不想找新版本源码,可以直接修改现有lua-cjson的C源码:
- 打开lua-cjson的源码文件,找到所有调用
lua_objlen的位置 - 将
lua_objlen(L, idx)替换为lua_rawlen(L, idx)(Lua 5.3中lua_rawlen替代了lua_objlen的功能) - 重新编译安装:
make clean && make && make install
方法三:替换为其他兼容Lua 5.3的JSON库
如果上面的方法都嫌麻烦,也可以换用纯Lua实现的JSON库,比如dkjson——它不需要编译,直接放到项目路径里require就能用,对Lua版本的兼容性非常好。
完成上述操作后,再运行你的代码:
package.path = package.path .. ";../?.lua" local json = require('cjson')
应该就能正常加载cjson模块了。
内容的提问来源于stack exchange,提问作者Kousha
相关产品推荐
相关产品推荐

