我正在尝试创建一个自定义输出插件逻辑复制(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');
我得到一个错误说:
在我的代码中,我将函数声明为extern:输出插件必须声明_PG_output_plugin_init符号
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/