2012-11-09 60 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