我正在用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
答案 0 :(得分:5)
从内存中,hstore
不会暴露很多C API。您必须通过server programming interface (SPI)使用它,通过C扩展使用其SQL级接口。 UPDATE :或者,as Tom Lane points out on the mailing list,使用fmgr
来调用它公开的SQL函数,而不是使用SPI来运行完整的SQL语句。 UPDATE2 :另一种选择是直接load_external_function("extension", "symbol")
C函数;见fmgr.h
。
您尝试在hstore
中使用的大多数函数都将被声明为static
(因此它们是hstore模块的本地函数),这可能是您获取未定义引用的原因。您只能使用hstore.h
中声明的内容作为宏或extern
函数。您不能通过直接C链接调用(例如)hstore_io.c
中找到的任何函数。
PG_LIBS
允许您指定要链接的共享库,但hstore.so
不是在编译期间用于链接的典型共享库。它是一个PostgreSQL扩展模块,旨在由服务器dlopen()
编写。我不认为真正支持链接到另一个的扩展模块。这意味着你可能甚至无法使用extern
函数而不需要进行大量的黑客攻击。
使用SPI,fmgr
或load_external_function
。
如果使用load_external_function
,您可能需要管理内存上下文和其他调用上下文。试着找一下它的用例。
请参阅: