【问题标题】:Creating C++ Redis Module - "does not export RedisModule_OnLoad() symbol"创建 C++ Redis 模块 - “不导出 RedisModule_OnLoad() 符号”
【发布时间】:2018-10-27 23:37:12
【问题描述】:

我在加载我的 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,但这仍然适用于 AFAIK。

【问题讨论】:

    标签: c++ redis g++ shared-libraries symbols


    【解决方案1】:

    这是因为 RedisModule_OnLoad 正在通过您的 C++ 编译器获取 name mangled

    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
    

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 2022-01-12
      • 2015-06-18
      • 2010-09-18
      • 2021-11-06
      相关资源
      最近更新 更多