gpt4 book ai didi

c++ - postgresql c-extension 加载另一个外部库

转载 作者:行者123 更新时间:2023-11-28 03:33:36 27 4
gpt4 key购买 nike

我需要将 pHashes (phash.org) 与汉明距离函数进行比较。

我尝试了 pg_similarity 中的那个,但它似乎不能正常工作。 (相同的 pHashes 的汉明距离不为 0)。

所以我想我只需要使用 c 扩展来使用作为 pHash 库一部分的 ph_hamming_distance 函数。

我有什么:phash.c

#include <postgres.h>
#include <pHash.h>
#include <fmgr.h>
#include <utils/bytea.h>
#include <utils/datum.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(phash_hamming);
Datum phash_hamming(PG_FUNCTION_ARGS) {

bytea *bytea1 = PG_GETARG_BYTEA_P(0);
bytea *bytea2 = PG_GETARG_BYTEA_P(1);
//FIXME - length of bytea1 & bytea2 must be 4 bytes (64bits)

ulong64 long1 = *((ulong64*) bytea1);
ulong64 long2 = *((ulong64*) bytea2);

int32 ret = ph_hamming_distance(long1, long2);

PG_RETURN_INT32(ret);
}

生成文件

CXXFLAGS=-I/usr/include/postgresql/server
LDFLAGS=-Bstatic -lpHash
all: phash.o

phash.o:
$(CXX) $(CXXFLAGS) -fpic -c phash.c
$(CXX) $(LDFLAGS) -shared -o phash.so phash.o

install:
cp phash.so `pg_config --pkglibdir`

clean:
rm -f phash.o phash.so

SQL

 CREATE FUNCTION phash_hamming (bytea1 bytea, bytea2 bytea) RETURNS int AS '$libdir/phash' LANGUAGE C;

我得到的错误:

ERROR:  could not load library "/usr/lib/postgresql/phash.so": /usr/lib/postgresql/phash.so: undefined symbol: _Z16pg_detoast_datumP7varlena

我不能以某种方式正确链接到 postgresql 吗?

最佳答案

这是一个老问题,但是...

  1. 无需添加额外的包装文件并使用 gcc 进行编译。
  2. 您需要 extern "C"PostgreSQL header 和 PostgreSQL 宏。

    extern "C" {
    #include <postgres.h>
    #include <fmgr.h>
    #ifdef PG_MODULE_MAGIC
    PG_MODULE_MAGIC
    #endif
    }

关于c++ - postgresql c-extension 加载另一个外部库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11838963/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com