Redis
 sql >> Base de données >  >> NoSQL >> Redis

Création du module C++ Redis - n'exporte pas le symbole RedisModule_OnLoad()

Cela se produit parce que RedisModule_OnLoad obtient un nom mutilé par votre compilateur C++.

RedisModule_OnLoad est renommé en __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi par GCC, donc Redis est incapable de trouver le symbole exporté qu'il recherche.

$ nm avromodule.so | grep OnLoad                   
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi

Vous pouvez utiliser le extern "C" directive pour garantir que vos symboles exportés restent non mutilés.

#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

Ce qui entraîne l'exportation d'un symbole non mutilé

nm avromodule.so | grep OnLoad                   
0000000000000970 T _RedisModule_OnLoad