2016-07-22 36 views
0

系統詳細信息設置位計數:錯誤使用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但沒有幫助。

回答

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後的標識符)甚至會被接受一個編譯器。你正在使用哪種編譯器?

+0

謝謝,我似乎忽略了fmgr.h是需要的,你建議的修改解決了我的問題,並且存儲過程正在工作。我正在使用aws ec2實例上安裝的任何c編譯器。哈哈我不敢相信我犯了這樣一個愚蠢的錯誤,也許我現在應該睡覺。非常感謝! –