Tihiroの頭を休めるIT教室

少しだけ頭使って後は根性

PG_MODULE_MAGICを記述しているのにPG_MODULE_MAGICが見つからない。というエラー。

概要

PostgreSQLの拡張ライブラリを自作した時のお話。

Cプログラムのソース内に「PG_MODULE_MAGIC」を記述しているのに、記述が見つからないとエラーが出る。

環境

内容

PostgreSQLサーバー起動時に

サーバの起動完了を待っています....
FATAL:  incompatible library "C:/postgresql/10.3/lib/my_contrib.dll": missing magic block
HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.
LOG:  database system is shut down
待機処理が停止されました
pg_ctl: サーバを起動できませんでした。
ログ出力を確認してください。

みたいな悲しい出来事に遭遇する。

対応

#include <fmgr.h>

を追加。

37.9. C言語関数

公式ドキュメントにバッチリ書いてますね。素晴らしい。

ちなみに

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC
#endif

の、#ifdefテストはPostgreSQL8.2より前のバージョン用なので、不要な感じです。

それでもダメなら

そもそもコンパイルが正常に通っていない可能性があります。警告やエラーメッセージが出力されていないかを確認してみてください。

まとめ

公式ドキュメントをよく読みましょう。