创建C ++ Redis模块-“不导出RedisModule_OnLoad()符号"; [英] Creating C++ Redis Module - "does not export RedisModule_OnLoad() symbol"
问题描述
加载Redis模块时遇到问题.我只是从 https://redis.io/topics/modules-intro 复制示例,但我将其剥离了.
I am having some trouble loading my Redis module. I am just copying the example from https://redis.io/topics/modules-intro, but I stripped it down.
#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中.我使用以下命令对其进行编译:
This is saved in avromodule.cpp. I compile it using the following:
g++ -shared -fPIC -o avromodule.so avromodule.cpp
然后我转到Redis CLI并尝试加载该模块.
Then I go over to the Redis CLI and try to load the module.
10.XXX.XXX.XXX:7004> module load /path/to/module/avromodule.so
(error) ERR Error loading the extension. Please check the server logs.
服务器日志给我以下错误:
The server logs give me the following error:
159392:M 17 May 10:21:19.773 # Module /path/to/module/avromodule.so does not export RedisModule_OnLoad() symbol. Module not loaded.
上面的错误对我来说是没有意义的,因为我使用'nm'命令获得了以下输出:
The above error makes no sense to me, because I get the following output using the 'nm' command:
$ nm -CD avromodule.so | grep " T "
0000000000003622 T RedisModule_OnLoad(RedisModuleCtx*, RedisModuleString**, int)
000000000000366c T _fini
0000000000002878 T _init
有人知道这里可能出什么问题吗?我知道我使用的是C ++,而不是推荐的C,但是AFAIK仍然可以使用.
Does anyone have a clue what could be going wrong here? I know that I am using C++ as opposed to the recommended C, but this should still work AFAIK.
推荐答案
之所以会这样,是因为 RedisModule_OnLoad
正在获得名称被C ++编译器修改.
This is happening because RedisModule_OnLoad
is getting name mangled by your C++ compiler.
RedisModule_OnLoad
重命名为 __ Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi
,因此Redis无法找到其正在寻找的导出符号.
RedisModule_OnLoad
is getting re-named to to __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi
by GCC, so Redis is unable to find the exported symbol it is looking for.
$ nm avromodule.so | grep OnLoad
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi
您可以使用 extern"C"
指令来确保您导出的符号不被修改.
You can use the extern "C"
directive to ensure your exported symbols remain un-mangled.
#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
这将导致未损坏的符号被导出
Which results in an un-mangled symbol getting exported
nm avromodule.so | grep OnLoad
0000000000000970 T _RedisModule_OnLoad
这篇关于创建C ++ Redis模块-“不导出RedisModule_OnLoad()符号";的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!