1

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

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

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

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

我收到一条错误消息:

输出插件必须声明 _PG_output_plugin_init 符号

在我的代码中,我将函数声明为 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)或者是否还有其他步骤。任何人都可以解释一下吗?

4

1 回答 1

1

默认情况下,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/

于 2016-09-14T21:50:07.413 回答