加载自定义Redis模块时出现Undefined symbol "RedisModule_DictNext"错误
Redis模块加载报错
undefined symbol: RedisModule_DictNext的排查方案 Redis服务器版本过低
RedisModule_DictNext是Redis较新版本才引入的模块API(Redis 6.0.6及以后版本支持)。如果你的Redis服务版本太老,核心程序根本没有导出这个符号,自然会加载失败。先执行redis-server --version检查版本,直接升级到支持该API的版本(推荐6.2+)即可解决。编译参数或链接方式错误
编译Redis模块时必须生成位置无关的共享库,且要明确符号由Redis主程序提供:- C语言编译:
gcc -fPIC -c my_module.c -o my_module.o gcc -shared -o my_module.so my_module.o - C语言编译:
由于C会进行名字修饰,必须用extern "C"包裹redismodule.h的引入,避免符号名被篡改:
编译命令还要链接C++标准库:extern "C" { #include "redismodule.h" }g++ -fPIC -c my_module.cpp -o my_module.o g++ -shared -o my_module.so my_module.o -lstdc++
- C语言编译:
头文件与Redis服务器版本不匹配
如果你用的redismodule.h是新版本的(包含RedisModule_DictNext声明),但运行的Redis服务器是旧版本的(没导出这个符号),就会出现符号找不到的问题。必须保证头文件和Redis服务器版本完全一致,直接从你正在运行的Redis源码中拷贝对应的redismodule.h来编译模块。编译时未遵循Redis模块的规范
手动编译容易遗漏必要的编译规则,建议参考Redis官方模块的编译模板,或者直接将模块代码放到Redis源码的MODULES目录下,利用源码自带的Makefile编译,确保所有Redis模块要求的编译参数都被正确应用。
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

