作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在加载我的 Redis 模块时遇到了一些问题。我只是从 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
正在获取 name mangled由你的 C++ 编译器。
RedisModule_OnLoad
被 GCC 重命名为 __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi
,因此 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
关于c++ - 创建 C++ Redis 模块 - "does not export RedisModule_OnLoad() symbol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395887/
我在加载我的 Redis 模块时遇到了一些问题。我只是从 https://redis.io/topics/modules-intro 复制示例,但我将其剥离。 #include "redismodul
我是一名优秀的程序员,十分优秀!