Обсуждение: User Defined C Function with minGW

Поиск
Список
Период
Сортировка

User Defined C Function with minGW

От
"Nathan Thatcher"
Дата:
I have been creating some user defined C functions using minGW and
postgreSQL 8.3. Everything works great when I use integers,
timestamps, points, etc. I have compiled, linked, created, and tested
multiple function and aggregates.

The problem occurs when I have a text parameter and need to use
PG_GETARG_TEXT_P(n). The code compiles just fine but linking fails.
Here is an example:

#include "postgres.h"
#include "fmgr.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(function);

Datum
function(PG_FUNCTION_ARGS)
{
    text *t = PG_GETARG_TEXT_P(1);
    int32 i = PG_GETARG_INT32(0);
    PG_RETURN_INT32(i+1);
}

The error:
X)function_name.o:function_name.c: undefined reference to `pg_detoast_datum'
If I comment out the text *t line then it compiles, links, and
executes just fine.

The problem (I am assuming it is the same problem) also manifests
itself when I make a call to palloc. I get 2 errors

X) finalagent.o:finalagent.c: undefined reference to
`_imp__CurrentMemoryContext'
X) finalagent.o:finalagent.c: undefined reference to `MemoryContextAlloc'

Some people have said that this error should just be ignored and it
will sort itself out at run-time. That sounds swell but how do I get
my linker to ignore these errors?

Other people have said that pg_detoast_datum is a backend function and
shouldn't be referenced at all, but it is right there in fmgr.h which
is obviously required for creating functions under the V1 calling
convention.

For reference, I am on Windows XP SP2. I installed postgreSQL 8.3 from
the msi and selected to include the Development components (Include
Files, Library Files, Tools and utilities). The compiler is including
the following directories:

C:\PostgreSQL\8.3\include
C:\PostgreSQL\8.3\include\server
C:\PostgreSQL\8.3\include\server\port\win32"

I added both C:\PostgreSQL\8.3\lib and C:\PostgreSQL\8.3\bin to my
linker hoping that maybe it would work. It didn't.

Any information, insight, tips, or criticism would be welcomed and appreciated.

-Subordin8

Re: User Defined C Function with minGW

От
Martijn van Oosterhout
Дата:
On Fri, May 02, 2008 at 09:34:31AM -0600, Nathan Thatcher wrote:
> Other people have said that pg_detoast_datum is a backend function and
> shouldn't be referenced at all, but it is right there in fmgr.h which
> is obviously required for creating functions under the V1 calling
> convention.

You usually get these kinds of error if you try to compile the code
into an executable, since then all symbols need to be resolved. You
need to link it as a shared object, where this isn't required. I think
you might need some kind of import DLL of something like that?

Have a nice day.
--
Martijn van Oosterhout   <kleptog@svana.org>   http://svana.org/kleptog/
> Please line up in a tree and maintain the heap invariant while
> boarding. Thank you for flying nlogn airlines.

Вложения