Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search for
  Advanced Search

Re: "undefined reference" error when compiling


  • From: Andrew Dunstan <andrew(at)dunslane(dot)net>
  • To: mark(at)maxpreps(dot)com
  • Cc: pgsql-hackers-win32(at)postgresql(dot)org
  • Subject: Re: "undefined reference" error when compiling
  • Date: Mon, 25 Apr 2005 18:46:59 -0400
  • Message-id: <426D7363(dot)9010706(at)dunslane(dot)net>


Well, you picked a difficult target to learn on :-)

If you look in pgxs.mk you will see some clues. You might need to set something to point to the installed lib directory (Maybe SHLIB_LINK ?). some value like -L/c/progra~1/postgresql/8.0/lib

And if you are coming from Windows build experience and think all this has rough edges, you're right, it does.

cheers

andrew

Mark Miller wrote:

You're right, I could just install it there. That's the easiest way around
it. But I WOULD like to know why it's mapping to the wrong directory and how
to work around it. It would be better if I could install it where ever I
like. I'm doing this all as a learning experince. Since I have no experience
with any of these technologies (C, postgresql, gcc, makefiles), I just want
to figure out how to do it right.

Thanks,
Mark

-----Original Message-----
From: Andrew Dunstan [mailto:andrew(at)dunslane(dot)net] Sent: Monday, April 25, 2005 3:15 PM
To: mark(at)maxpreps(dot)com
Subject: Re: [pgsql-hackers-win32] "undefined reference" error when
compiling extension functions

Install instead to

C:\MSYS\1.0\local\pgsql - under MSys that will map to /usr/local/pgsql

Personally, if I were building extensions I would have built/installed pg
from scratch, rather than using the installer.

cheers

andrew


Mark Miller wrote:

Thanks, that simplifies things.

But I ran into the following problem:

$ make
dlltool --export-all --output-def filesize.def filesize.o
dllwrap -o filesize.dll --def filesize.def filesize.o
c:/Progra~1/PostgreSQL/8.0/lib/pgxs/src/makefiles/../../src/utils/dllinit.o
-L/usr/local/pgsql/bin -lpostgres
c:\MinGW\bin\..\lib\gcc-lib\mingw32\3.2.3\..\..\..\..\mingw32\bin\ld.exe:
cannot find -lpostgres
c:\MinGW\bin\dllwrap.exe: c:\MinGW\bin\gcc exited with status 1
make: *** [filesize.dll] Error 1


Here's the makefile (located in /home/usr/dev (windows path is:
C:\MSYS\1.0\home\mark\dev)  ***:


MODULES = filesize

PGXS := $(shell pg_config --pgxs)
include $(PGXS)

*** ( postgresql is installed in C:\Progra~1\postgresql\8.0\)

It looks like "-L/usr/local/pgsql/bin -lpostgres" is looking in the wrong
directory. I reinstalled making sure I used the --prefix parameter for
configure, but it's still looking in the wrong place. How do I point it to
the right "bin" directory?.

Again, I did a windows install followed by using MinGW and MSYS to install
the headers needed for development. (The reason for doing separate installs
was so I could install PostgreSQL as a service and make sure the proper
accounts were set up).

Thanks again for your help,
Mark


-----Original Message-----
From: Andrew Dunstan [mailto:andrew(at)dunslane(dot)net] Sent: Monday, April 25, 2005 2:05 PM
To: mark(at)maxpreps(dot)com
Cc: pgsql-hackers-win32(at)postgresql(dot)org
Subject: Re: [pgsql-hackers-win32] "undefined reference" error when
compiling extension functions


You might find using the pgxs setup, new in 8.0, useful. See http://www.postgresql.org/docs/current/static/xfunc-c.html#XFUNC-C-PGXS

cheers

andrew

Mark Miller wrote:



I am trying to figure out how to write extension functions and I am getting "undefined reference" errors when I compile on the lines which call "malloc" and "pfree". How can I get the compiler to see the functions so I can compile successfully?

I installed PostgreSQL on XP Pro using the windows installer, then I installed the includes (which are not part of the windows install) by running the following commands:

configure --without-zlib --includedir=/c/progra~1/postgresql/8.0/include --with-includes=/c/progra~1/postgresql/8.0/include/port/win32/*

make -C src/include install

Here's the output from make when I try to compile:

$ make makefile filesize.dll

make: Nothing to be done for `makefile'.

gcc -g -I c:/Progra~1/PostgreSQL/8.0/include -I c:/Progra~1/PostgreSQL/8.0/include/server -I c:/Progra~1/PostgreSQL/8.0/include/server/port/win32 -I c:/Progra~1/PostgreSQL/8.0/lib -fpic -c filesize.c

cc1.exe: warning: -fpic ignored for target (all code is position independent)

gcc -g -I c:/Progra~1/PostgreSQL/8.0/include -I c:/Progra~1/PostgreSQL/8.0/include/server -I c:/Progra~1/PostgreSQL/8.0/include/server/port/win32 -I c:/Progra~1/PostgreSQL/8.0/lib -shared -o filesize.dll filesize.o

filesize.o(.text+0x1a): In function `filesize':

C:/msys/1.0/home/mark/dev/filesize.c:9: undefined reference to `pg_detoast_datum'

filesize.o(.text+0x3d):C:/msys/1.0/home/mark/dev/filesize.c:11: undefined reference to `_imp__CurrentMemoryContext'

filesize.o(.text+0x44):C:/msys/1.0/home/mark/dev/filesize.c:11: undefined reference to `MemoryContextAlloc'

filesize.o(.text+0x9b):C:/msys/1.0/home/mark/dev/filesize.c:19: undefined reference to `pfree'

filesize.o(.text+0xb1):C:/msys/1.0/home/mark/dev/filesize.c:25: undefined reference to `pfree'

make: *** [filesize.dll] Error 1

Here's the source I'm trying to compile (taken from PostgreSQL ch 6 by Douglas and Douglas):

#include "postgres.h"

#include "fmgr.h"

#include <sys/stat.h>

PG_FUNCTION_INFO_V1(filesize);

Datum filesize(PG_FUNCTION_ARGS)

{

text * fileNameText = PG_GETARG_TEXT_P(0);

size_t fileNameLen = VARSIZE( fileNameText ) - VARHDRSZ;

char * fileName = (char *)palloc( fileNameLen + 1 );

struct stat statBuf;

memcpy( fileName, VARDATA( fileNameText), fileNameLen );

fileName[fileNameLen] = '\0';

if( stat(fileName, &statBuf) == 0 && S_ISREG(statBuf.st_mode) )

{

pfree( fileName );

PG_RETURN_INT32((int32)statBuf.st_size);

}

else

{

pfree( fileName );

PG_RETURN_NULL();

}

}

Here's the makefile, from the same example but modified to include the needed include directories and to output ".dll" file instead of ".so".

# File name: makefile

SERVER_INCLUDES += -I $(shell pg_config --includedir)

SERVER_INCLUDES += -I $(shell pg_config --includedir-server)

SERVER_INCLUDES += -I $(shell pg_config --includedir-server)/port/win32

SERVER_INCLUDES += -I $(shell pg_config --libdir)

CFLAGS += -g $(SERVER_INCLUDES)

.SUFFIXES: .dll

.c.dll:

$(CC) $(CFLAGS) -fpic -c $<

$(CC) $(CFLAGS) -shared -o $@ $(basename $<).o





---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
     joining column's datatypes do not match




Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group