当前位置: 首页 > 面试题库 >

创建C ++ Redis模块-“不导出RedisModule_OnLoad()符号”

越伯寅
2023-03-14
问题内容

我在加载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仍然可以使用。


问题答案:

这是发生,因为RedisModule_OnLoad越来越重整名称由C
++编译器。

RedisModule_OnLoad__Z18RedisModule_OnLoadP14RedisModuleCtxPP17RedisModuleStringiGCC
重命名为,因此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


 类似资料:
  • 本文向大家介绍Python创建模块及模块导入的方法,包括了Python创建模块及模块导入的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python创建模块及模块导入的方法。分享给大家供大家参考。具体分析如下: python学习手册中写道: 定义模块,只要使用文本编辑器,把一些python代码输入到文本中,然后以.py为后缀名进行保存,任何此类文件都会被认为是python模块。 比如

  • 在我们前面的例子中,我们开始看到了。 我们的根模块有一个组件,一个管道和一个服务,其唯一的目的是处理信用卡。 如果我们将这三个元素提取到自己的功能模块,然后将它们导入我们的根模块怎么办? 我们将这样做。第一步是创建两个文件夹以区分属于根模块的元素和属于要素模块的元素。 注意每个模块文件夹下的模块文件: app.module.ts 和 credit-card.module.ts.。让我们先关注后者。

  • 如果你已经有一个项目,你想在这个项目中创建一个 Module ,你可以选择 File --> New Module 。 这样,会在当前的目录下创建一个 Module ,而不是在一个新的窗口中,单独创建 Project 和 Module 。 之后,你就会看到下面的界面。 同样的道理,你可以设置项目类型,但是,由于你现在是创建一个 Module ,所以只能选择一种类型。 下方的4个选项代表着不同的意义

  • 5.2.1 导入模块及创建根窗口 为了使用 Tkinter 模块中提供的绘图功能,首先要将该模块导入到程序中,就像我们以 前导入 math 模块以使用其中的数学函数、导入 string 模块以使用其中的字符串操作函数一 样。可以用下列两种方式中的任何一种导入 Tkinter: import Tkinter 或者 from Tkinter import * 如我们以前所说,这两种导入方法的差别仅

  • 当我试图编译我的新的模块化Java 11应用程序时,我收到了这个错误消息: 这似乎是一个依赖项的依赖项的问题。我甚至找不到是哪个模块把它拉进来,这样我就可以更新它了。 我使用的是openjdk 11.0.2、IntelliJ 2018.3.4、Maven 有什么建议我可以如何解决或修复这个问题吗?我在这个问题上找到的文件很少。

  • 在本章中,我们将研究在Joomla中Creating Modules 。 模块是灵活且轻量级的扩展,可用于页面呈现。 创建模块 以下是在Joomla中创建模块的简单步骤。 Step (1) - 在Joomla → modules文件夹中创建一个名为mod_firstmodule文件夹。 Step (2) - 在mod_firstmodule文件夹中创建一个名为“helper.php”的文件。 此文