创建C++ Redis模块遇「未导出RedisModule_OnLoad()符号」错误求助
Redis模块加载失败:找不到
RedisModule_OnLoad()符号(C++编写场景) 这个问题的核心原因是**C++的名字修饰(Name Mangling)**在搞鬼!
你用C++编译代码时,编译器会对函数名进行特殊处理(比如添加参数类型相关的后缀),生成一个和原始函数名不一样的符号——这就是你用nm看到的RedisModule_OnLoad(RedisModuleCtx*, RedisModuleString**, int)这个长符号。但Redis是用C语言实现的,它加载模块时只会去寻找C风格的未修饰符号RedisModule_OnLoad,自然就匹配不上了。
解决方案:用extern "C"强制C风格符号导出
修改你的avromodule.cpp代码,把RedisModule_OnLoad函数用extern "C"包裹,让编译器按照C的规则生成符号:
#include "redismodule.h" #include <stdlib.h> // 用extern "C"强制C风格符号导出 extern "C" int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { if (RedisModule_Init(ctx,"avromodule",1,REDISMODULE_APIVER_1) == REDISMODULE_ERR) return REDISMODULE_ERR; return REDISMODULE_OK; }
验证修改效果
重新编译模块:
g++ -shared -fPIC -o avromodule.so avromodule.cpp
再用nm查看符号,就能看到C风格的未修饰符号了:
nm -CD avromodule.so | grep " T RedisModule_OnLoad"
输出会变成:
0000000000003622 T RedisModule_OnLoad
这时候再在Redis CLI执行module load /path/to/module/avromodule.so,就能成功加载模块了。
内容的提问来源于stack exchange,提问作者Sidd Singal
相关产品推荐
相关产品推荐

