系统详细信息设置位计数:错误使用C创建新的存储功能,在BIGINT
NAME="Amazon Linux AMI"
VERSION="2016.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2016.03"
PRETTY_NAME="Amazon Linux AMI 2016.03"
POSTGRESVERSION="9.4.6"
我想C语言创建一个存储函数来计算了在一个BIGINT设置的位数,因此使用这种算法:
Count number of bits in a 64-bit (long, big) integer?
我写了这个代码:
#include "/usr/include/pgsql92/server/postgres.h"
#ifdef
PG_MODULE_MAGIC;
#endif
int bitcardinality(unsigned long i){
i = i - ((i >> 1) & 0x5555555555555555UL);
i = (i & 0x3333333333333333UL) + ((i >> 2) & 0x3333333333333333UL);
return (int) (((i + (i >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56;
}
并编译为: sudo cc -fpic -c〜/ landingzone/cfuncts/bitcardinality.c sudo cc -shared -o〜/ landingzone/cfuncts/bitcardinality.so〜/ landingzone/cfuncts/bitcardinality.o
并置于所以在$ LIBDIR文件夹,使用本指南:
https://momjian.us/main/writings/pgsql/aw_pgsql_book/node170.html
我创造了这个功能创建语句:
CREATE FUNCTION bitcardinality(BIGINT bitstring)
RETURNS BIGINT
AS '$libdir/bitcardinality.so'
LANGUAGE 'C';
其中给出这个错误:
ERROR: incompatible library "/usr/lib64/pgsql92/bitcardinality.so": missing magic block HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
我甚至尝试删除#ifdef #endif但没有帮助。
谢谢,我似乎忽略了fmgr.h是需要的,你建议的修改解决了我的问题,并且存储过程正在工作。我正在使用aws ec2实例上安装的任何c编译器。哈哈我不敢相信我犯了这样一个愚蠢的错误,也许我现在应该睡觉。非常感谢! –