在C中创建新的存储函数时出错,以计算BIGINT中的设置位

时间:2016-07-22 07:26:55

标签: postgresql

系统详细信息:

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

并使用本指南将so放在$ 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,但这没有帮助。

1 个答案:

答案 0 :(得分:2)

以下是PG_MODULE_MAGIC的文档: https://www.postgresql.org/docs/9.2/static/xfunc-c.html

看起来正确的调用是

#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#else
#error "PG_MODULE_MAGIC wasn't defined!"
#endif

我很惊讶您编写的内容(#ifdef之后没有标识符)甚至会被编译器接受。您使用的是哪种编译器?