Ошибка запуска пользовательского плагина на Postgres, "выходные плагины должны объявлять символ _PG_output_plugin_init"

Я пытаюсь создать собственный выходной плагин для логической репликации (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');

Я получаю сообщение об ошибке:

выходные плагины должны объявить символ _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) или есть какой-то другой шаг, чтобы сделать. Кто-нибудь может пролить свет?

1 ответ

Решение

Visual Studio не будет экспортировать эти символы по умолчанию. Вы можете решить эту проблему, объявив свои функции как:

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

Вот полезное руководство по созданию библиотек Postgres в Visual Studio здесь:

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

Другие вопросы по тегам