2012-11-09 123 views
3

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

我试过PG_LIBS=hstore但加载库时出现未定义的引用错误。

下一个尝试是SHLIB_LINK=-L/usr/lib/postgresql/9.1/lib -lhstore(libhstore.so不存在于系统中,只有hstore.so,所以我用符号和硬链接试过),并获得

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 
+1

真的是没有足够的信息在这里。我猜根据你的共享对象名称,你在Linux或BSD上,而你似乎在使用PostgreSQL 9.1。你第一次得到什么未定义的参考错误? –

+0

是的,它是Linux,它是PostgreSQL 9.1。未定义的引用是对hirsore.h中的Pairs,HStore和一些函数。 – user1811265

回答

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:另一种选择是直接向C函数load_external_function("extension", "symbol");请参阅fmgr.h

你试图在hstore中使用的大多数函数将被声明为static(所以它们是hstore模块的本地),这可能是为什么你会得到未定义的引用。您只能使用hstore.h中声明的内容作为宏或extern函数。你不能通过直接的C链接调用你在(比如说)hstore_io.c中找到的任何函数。

PG_LIBS允许您指定要链接到的共享库,但hstore.so不是用于在编译期间链接到的典型共享库。这是一个PostgreSQL扩展模块,旨在由服务器编辑dlopen()。我不认为一个扩展模块链接到另一个是真的支持。这意味着你可能甚至无法使用extern函数,而没有多少黑客入侵。

使用SPI,fmgrload_external_function

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

参见:

+0

谢谢,只要我能到达我的电脑,我就会尝试两种变体。 (我也回答了你对这个问题本身的评论,只是为了让其他人看得出来,我认为我不认为os结尾,甚至pg版本在这种情况下真的很重要) – user1811265

+0

@ user1811265可能不是,因为它证明了,但它节省了时间最好包括即使你不确定,尤其是在讨论env变量,链接器错误等时。尤其是引用链接器错误也不错。 –

+0

我这样做了: – user1811265