3

我正在用 C 编写 PostgreSQL 的扩展,我需要在我的 UDF 中使用hstore。我可以无错误地构建(使用 pgxc),但不能在 SQL 查询中使用任何函数。

我已经尝试过PG_LIBS=hstore,但在加载库时遇到了未定义的引用错误。

下一次尝试是SHLIB_LINK=-L/usr/lib/postgresql/9.1/lib -lhstore(系统中不存在 libhstore.so,只有 hstore.so,所以我尝试了 sym 和硬链接)并得到了

psql:libname.sql:69: ERROR:  could not load library
"/usr/lib/postgresql/9.1/lib/libname.so": libhstore.so: cannot open shared 
object file: No such file or directory
4

1 回答 1

5

从内存中,hstore不会暴露太多的 C API。您必须通过服务器编程接口 (SPI)使用它,通过 C 扩展使用它的 SQL 级接口。更新:或者,正如 Tom Lane 在邮件列表中指出的那样,使用fmgr调用它公开的 SQL 函数,而不是使用 SPI 运行完整的 SQL 语句。UPDATE2:另一种选择是load_external_function("extension", "symbol")直接使用 C 函数;见fmgr.h

您尝试使用的大多数函数都hstore将被声明static(因此它们是 hstore 模块的本地函数),这可能就是您获得未定义引用的原因。您只能将声明的内容hstore.h用作宏或extern函数。您不能只hstore_io.c通过直接 C 链接调用您在(例如)中找到的任何函数。

PG_LIBS允许您指定要链接到的共享库,但hstore.so不是用于在编译期间链接到的典型共享库。它是一个 PostgreSQL 扩展模块,旨在dlopen()由服务器编辑。我不认为真正支持链接到另一个的扩展模块。这意味着您可能甚至无法使用这些extern功能,而无需大量修改。

使用 SPI、fmgrload_external_function.

如果使用load_external_function您可能需要管理内存上下文和其他调用上下文。试着找到它的使用例子。

看:

于 2012-11-09T05:47:06.213 回答