You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:13:30