Thread: Pgxs - How to reference another extension
Hi, I am trying to create an extension that delegates some calls to btree_gist functions: DirectFunctionCall5Coll( gbt_text_consistent, …other arguments); Basic PGXS Makefile does not work - I get linker error: Undefined symbols for architecture arm64: "_gbt_text_consistent", referenced from: Anyone could provide me with some hints? — Michal
> On 11 Mar 2024, at 11:41, Michał Kłeczek <michal@kleczek.org> wrote: > > Hi, > > I am trying to create an extension that delegates some calls to btree_gist functions: > > DirectFunctionCall5Coll( > gbt_text_consistent, …other arguments); > > Basic PGXS Makefile does not work - I get linker error: > > Undefined symbols for architecture arm64: > "_gbt_text_consistent", referenced from: > > > Anyone could provide me with some hints? I’ve added: PG_LDFLAGS += -L$(shell $(PG_CONFIG) --pkglibdir) -lbtree_gist to Makefile and I get the following: ld: library 'btree_gist' not found clang: error: linker command failed with exit code 1 (use -v to see invocation) Note that I am on Mac and btree_gist.dylib is present in $(pg_config —pkglibdir) — Michal
On Mon, 11 Mar 2024 at 13:26, Michał Kłeczek <michal@kleczek.org> wrote: > > > > On 11 Mar 2024, at 11:41, Michał Kłeczek <michal@kleczek.org> wrote: > > > > Hi, > > > > I am trying to create an extension that delegates some calls to btree_gist functions: > > > > DirectFunctionCall5Coll( > > gbt_text_consistent, …other arguments); > > > > Basic PGXS Makefile does not work - I get linker error: > > > > Undefined symbols for architecture arm64: > > "_gbt_text_consistent", referenced from: > > > > > > Anyone could provide me with some hints? > > I’ve added: > PG_LDFLAGS += -L$(shell $(PG_CONFIG) --pkglibdir) -lbtree_gist You can try FunctionCall5Coll() or OidFunctionCall5Coll() functions. OidFunctionCall5Coll() calls fmgr_info() and FunctionCall5Coll(). What you only need is Oid of the target function. FunctionCall5Coll() can be useful and used when you have a cache variable of the function, where you store previously calculated FmgrInfo. -- Artur
On 11 Mar 2024, at 14:08, Artur Zakirov <zaartur@gmail.com> wrote:On Mon, 11 Mar 2024 at 13:26, Michał Kłeczek <michal@kleczek.org> wrote:On 11 Mar 2024, at 11:41, Michał Kłeczek <michal@kleczek.org> wrote:
Hi,
I am trying to create an extension that delegates some calls to btree_gist functions:
DirectFunctionCall5Coll(
gbt_text_consistent, …other arguments);
Basic PGXS Makefile does not work - I get linker error:
Undefined symbols for architecture arm64:
"_gbt_text_consistent", referenced from:
Anyone could provide me with some hints?
I’ve added:
PG_LDFLAGS += -L$(shell $(PG_CONFIG) --pkglibdir) -lbtree_gist
You can try FunctionCall5Coll() or OidFunctionCall5Coll() functions.
OidFunctionCall5Coll() calls fmgr_info() and FunctionCall5Coll(). What
you only need is Oid of the target function.
What I am trying to do is wrapping and decoration of gbt_text_consistent function.
The reason I want to use DirectFunctionCall5Col is that other variants require catalog lookup
as I don’t have old of the wrapped function.
The lookup itself is problematic as the only piece of information I have is the strategy number.
What’s more - the result of the lookup should be cached in fn_extra and that makes things even more complex.
Is there any way to simply link against another extension library?
—
Thanks
On 3/11/24 09:48, Michał Kłeczek wrote: > > >> On 11 Mar 2024, at 14:08, Artur Zakirov <zaartur@gmail.com> wrote: >> >> On Mon, 11 Mar 2024 at 13:26, Michał Kłeczek <michal@kleczek.org >> <mailto:michal@kleczek.org>> wrote: >>> >>> >>>> On 11 Mar 2024, at 11:41, Michał Kłeczek <michal@kleczek.org> wrote: >>>> >>>> Hi, >>>> >>>> I am trying to create an extension that delegates some calls to >>>> btree_gist functions: >>>> >>>> DirectFunctionCall5Coll( >>>> gbt_text_consistent, …other arguments); >>>> >>>> Basic PGXS Makefile does not work - I get linker error: >>>> >>>> Undefined symbols for architecture arm64: >>>> "_gbt_text_consistent", referenced from: >>>> >>>> >>>> Anyone could provide me with some hints? >>> >>> I’ve added: >>> PG_LDFLAGS += -L$(shell $(PG_CONFIG) --pkglibdir) -lbtree_gist >> >> You can try FunctionCall5Coll() or OidFunctionCall5Coll() functions. >> >> OidFunctionCall5Coll() calls fmgr_info() and FunctionCall5Coll(). What >> you only need is Oid of the target function. > > What I am trying to do is wrapping and decoration of gbt_text_consistent > function. > The reason I want to use DirectFunctionCall5Col is that other variants > require catalog lookup > as I don’t have old of the wrapped function. > The lookup itself is problematic as the only piece of information I have > is the strategy number. > What’s more - the result of the lookup should be cached in fn_extra and > that makes things even more complex. > > Is there any way to simply link against another extension library? I used this successfully in the past with postgis: postgis_libdir := $(shell pg_config --pkglibdir) postgis_libver := $(shell ls -1 $(postgis_libdir) | grep "^postgis") SHLIB_LINK += -L$(postgis_libdir) -l:$(postgis_libver) -llwgeom HTH, -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com
Hi
po 11. 3. 2024 v 14:48 odesílatel Michał Kłeczek <michal@kleczek.org> napsal:
On 11 Mar 2024, at 14:08, Artur Zakirov <zaartur@gmail.com> wrote:On Mon, 11 Mar 2024 at 13:26, Michał Kłeczek <michal@kleczek.org> wrote:On 11 Mar 2024, at 11:41, Michał Kłeczek <michal@kleczek.org> wrote:
Hi,
I am trying to create an extension that delegates some calls to btree_gist functions:
DirectFunctionCall5Coll(
gbt_text_consistent, …other arguments);
Basic PGXS Makefile does not work - I get linker error:
Undefined symbols for architecture arm64:
"_gbt_text_consistent", referenced from:
Anyone could provide me with some hints?
I’ve added:
PG_LDFLAGS += -L$(shell $(PG_CONFIG) --pkglibdir) -lbtree_gist
You can try FunctionCall5Coll() or OidFunctionCall5Coll() functions.
OidFunctionCall5Coll() calls fmgr_info() and FunctionCall5Coll(). What
you only need is Oid of the target function.What I am trying to do is wrapping and decoration of gbt_text_consistent function.The reason I want to use DirectFunctionCall5Col is that other variants require catalog lookupas I don’t have old of the wrapped function.The lookup itself is problematic as the only piece of information I have is the strategy number.What’s more - the result of the lookup should be cached in fn_extra and that makes things even more complex.Is there any way to simply link against another extension library?
The advantage of OidFunctionCall is fact, it is working on MacOS. My extension plpgsql_check has a lot of dependencies on plpgsql.
The linking on MacOS required special section in Makefile
ifeq ($(PORTNAME), darwin) |
override CFLAGS += -undefined dynamic_lookup |
And there was another problem with loading dependencies. So now, I use only indirect methods.
DirectFunctionCall is ok just for buildin functions.
Regards
Pavel
—Thanks
On 11 Mar 2024, at 15:00, Pavel Stehule <pavel.stehule@gmail.com> wrote:The advantage of OidFunctionCall is fact, it is working on MacOS. My extension plpgsql_check has a lot of dependencies on plpgsql.The linking on MacOS required special section in Makefile
ifeq ($(PORTNAME), darwin) endif
override CFLAGS += -undefined dynamic_lookup
Thanks! That worked (I am on MacOS indeed).
And there was another problem with loading dependencies.
Right - the problem seems to be:
ERROR: could not load library "/opt/homebrew/opt/postgresql@16/lib/postgresql/btree_gist_extra.dylib": dlopen(/opt/homebrew/opt/postgresql@16/lib/postgresql/btree_gist_extra.dylib, 0x000A): symbol not found in flat namespace '_gbt_text_consistent'
That only happens when btree_gist is _already_ loaded earlier.
When btree_gist is not loaded yet and I perform:
CREATE EXTENSION btree_gist_extra CASCADE;
all works fine.
So now, I use only indirect methods.
I would like to avoid it but maybe it is going to be necessary.
BTW - the extension is https://github.com/mkleczek/btree_gist_extra
Thanks!
—
Michal