Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Criando o módulo Redis C++ - não exporta o símbolo RedisModule_OnLoad()


Isso está acontecendo porque RedisModule_OnLoad está recebendo o nome mutilado pelo seu compilador C++.

RedisModule_OnLoad está sendo renomeado para __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi pelo GCC, então o Redis não consegue encontrar o símbolo exportado que está procurando.
$ nm avromodule.so | grep OnLoad                   
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi

Você pode usar o extern "C" diretiva para garantir que seus símbolos exportados permaneçam intactos.
#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

O que resulta em um símbolo não mutilado sendo exportado
nm avromodule.so | grep OnLoad                   
0000000000000970 T _RedisModule_OnLoad