sql >> Base de Datos >  >> NoSQL >> Redis

Creación del módulo C++ Redis:no exporta el símbolo RedisModule_OnLoad()

Esto sucede porque RedisModule_OnLoad el compilador de C++ está alterando el nombre.

RedisModule_OnLoad se le cambia el nombre a __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi por GCC, por lo que Redis no puede encontrar el símbolo exportado que está buscando.

$ nm avromodule.so | grep OnLoad                   
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi

Puedes usar la extern "C" directiva para garantizar que sus símbolos exportados permanezcan 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

Lo que da como resultado la exportación de un símbolo no alterado

nm avromodule.so | grep OnLoad                   
0000000000000970 T _RedisModule_OnLoad