Ошибка запуска пользовательского плагина на 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/