创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”

2024-05-22

我在加载 Redis 模块时遇到一些问题。我只是复制来自的示例https://redis.io/topics/modules-intro https://redis.io/topics/modules-intro,但我把它剥下来了。

#include "redismodule.h"
#include <stdlib.h>

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;
}

这保存在 avromodule.cpp 中。我使用以下命令编译它:

g++ -shared -fPIC -o avromodule.so avromodule.cpp

然后我转到 Redis CLI 并尝试加载模块。

10.XXX.XXX.XXX:7004> module load /path/to/module/avromodule.so
(error) ERR Error loading the extension. Please check the server logs.

服务器日志给我以下错误:

159392:M 17 May 10:21:19.773 # Module /path/to/module/avromodule.so does not export RedisModule_OnLoad() symbol. Module not loaded.

上述错误对我来说没有意义,因为我使用“nm”命令得到以下输出:

$ nm -CD avromodule.so | grep " T "
0000000000003622 T RedisModule_OnLoad(RedisModuleCtx*, RedisModuleString**, int)
000000000000366c T _fini
0000000000002878 T _init

有谁知道这里可能出了什么问题吗?我知道我使用的是 C++,而不是推荐的 C,但这应该仍然有效。


发生这种情况是因为RedisModule_OnLoad正在得到名称被破坏 https://en.wikipedia.org/wiki/Name_mangling由你的 C++ 编译器。

RedisModule_OnLoad正在重命名为 to__Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi由 GCC 提供,因此 Redis 无法找到它正在寻找的导出符号。

$ nm avromodule.so | grep OnLoad                   
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi

您可以使用extern "C"指令以确保导出的符号保持未损坏。

#include "redismodule.h"
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif

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;
}

#ifdef __cplusplus
}
#endif

这会导致导出未损坏的符号

nm avromodule.so | grep OnLoad                   
0000000000000970 T _RedisModule_OnLoad
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号” 的相关文章

随机推荐