几年前,我为我的 postgreSQL 数据库编写了一个 C 扩展(我认为那时候是 8.0 版——我使用的是 Version1 调用约定)。
我尝试使用以下方法在 PG 8.4 数据库中加载扩展:
CREATE FUNCTION foobar(float8[],float8[],float8[],float8[],int4) RETURNS int4
AS '$libdir/pg_myextlib.so' LANGUAGE 'c';
我收到了错误信息:
ERROR: incompatible library "/usr/lib/postgresql/8.4/lib/pg_myextlib.so": missing magic block HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
我快速搜索了一下,发现了一些关于此的旧话题。他们似乎都提供了类似于 here 的解决方案。 .
但是,由于这些线程很旧(+ 没有对答案进行投票),我认为最好在这里提问,看看解决这个问题的正确方法是什么。
旁白:因为底层库是用C写的,所以我在标签中包含了C。如果您认为“C”不是该问题的相关标签,请随时将其删除。
最佳答案
二进制模块在 mayor 版本之间不兼容。 PG_MODULE_MAGIC 宏确保了这一点。您必须将此宏添加到您的代码中并重新编译它。也许更多一点。只有 SPI API 是稳定的 - 其他内部功能不稳定 - 并且可能会有一些小的变化。
关于c - 需要扩展库才能使用 PG_MODULE_MAGIC 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8678645/