Postgres 上的自定义插件错误 运行,"output plugins have to declare the _PG_output_plugin_init symbol"

Error running custom plugin on Postgres, "output plugins have to declare the _PG_output_plugin_init symbol"

我正在尝试为逻辑复制创建一个自定义输出插件(Postgres 是 9.5.4 版本,我正在从 Windows 8/64 位机器构建项目 - 数据库所在的同一台机器已安装)。

我从样本 test_decoding 的代码开始,我试图用一个新名称简单地重建它并将它安装到 Postgres 中以查看模块是否工作。完成后,我将开始修改代码。

我的项目是在 Visual Studio 2013 年构建的,我采取的唯一步骤是将构建的程序集复制到 Postgres lib 文件夹下。当我 运行 命令时:

postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'my_decoding');

我收到一条错误消息:

output plugins have to declare the _PG_output_plugin_init symbol

在我的代码中,我将函数声明为 extern:

extern void _PG_init(void);
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);

并且函数体定义在它下面的某处。

实际代码只是 test_decoding 示例的副本:https://github.com/postgres/postgres/blob/REL9_5_STABLE/contrib/test_decoding/test_decoding.c

我不确定部署过程是否正常(只是复制 dll)或者是否需要采取其他步骤。任何人都可以解释一下吗?

默认情况下,

Visual Studio 不会导出这些符号。您可以通过将函数声明为:

来解决此问题
extern PGDLLEXPORT void _PG_init(void);
extern PGDLLEXPORT void _PG_output_plugin_init(OutputPluginCallbacks *cb);

在 Visual Studio 中有构建 Postgres DLL 的有用指南:

http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/