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



我正在尝试创建一个自定义输出插件逻辑复制(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

我不确定部署过程是否ok(只是复制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/

相关内容

最新更新