Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Erstellen des C++ Redis-Moduls – exportiert kein RedisModule_OnLoad()-Symbol

Dies geschieht, weil RedisModule_OnLoad wird Name von Ihrem C++-Compiler verstümmelt.

RedisModule_OnLoad wird umbenannt in __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi von GCC, sodass Redis das gesuchte exportierte Symbol nicht finden kann.

$ nm avromodule.so | grep OnLoad                   
0000000000000970 T __Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringi

Sie können das extern "C" verwenden Anweisung, um sicherzustellen, dass Ihre exportierten Symbole unverfälscht bleiben.

#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

Was dazu führt, dass ein unverfälschtes Symbol exportiert wird

nm avromodule.so | grep OnLoad                   
0000000000000970 T _RedisModule_OnLoad