/usr/bin/ld: cannot find [...] when compiling

Started by Janek Sendrowskiover 12 years ago9 messagesgeneral
Jump to latest
#1Janek Sendrowski
janek12@web.de

<html><head></head><body><div style="font-family: Verdana;font-size: 12.0px;"><div style="font-family: Verdana;font-size: 12.0px;">
<div>
<div>Hi,</div>

<div>&nbsp;</div>

<div>My Makefile looks like this:</div>

<div>
<div>PROGRAM = test<br/>
DATA = test.c<br/>
PG_CONFIG = pg_config<br/>
PGXS := &#36;(shell &#36;(PG_CONFIG) --pgxs)<br/>
include &#36;(PGXS)</div>

<div>&nbsp;</div>
</div>

<div>The file test.c only includes the postgres.h (#include &quot;postgres.h&quot;), but I get this error, when compiling:</div>

<div>/usr/bin/ld: cannot find -lxslt<br/>
/usr/bin/ld: cannot find -lxml2<br/>
/usr/bin/ld: cannot find -lpam<br/>
/usr/bin/ld: cannot find -ledit<br/>
collect2: ld returned 1 exit status<br/>
make: *** [test] Error 1</div>

<div>&nbsp;</div>

<div>Does anyone have an idea?</div>

<div>&nbsp;</div>

<div>Janek Sendrowski</div>
</div>
</div></div></body></html>

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Janek Sendrowski (#1)
Re: /usr/bin/ld: cannot find [...] when compiling

"Janek Sendrowski" <janek12@web.de> writes:

<div>The file test.c only includes the postgres.h (#include &quot;postgres.h&quot;), but I get this error, when compiling:</div>

<div>/usr/bin/ld: cannot find -lxslt<br/>
/usr/bin/ld: cannot find -lxml2<br/>
/usr/bin/ld: cannot find -lpam<br/>
/usr/bin/ld: cannot find -ledit<br/>
collect2: ld returned 1 exit status<br/>
make: *** [test] Error 1</div>

[ please don't post html-only mail to the PG lists ]

Where did you get your Postgres installation from? It looks like it was
configured to be built with a bunch of libraries that you don't have
installed, so I'm guessing it wasn't self-built.

The path of least resistance would be to install libxslt-devel,
libxml2-devel, pam-devel, libedit-devel, etc (or whatever those packages
are named on your platform), so as to match the build environment that
the Postgres package is expecting.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#3Janek Sendrowski
janek12@web.de
In reply to: Tom Lane (#2)
Re: /usr/bin/ld: cannot find [...] when compiling

Hi,

Thanks for your answer.
Now the link editor is working, but I still have one problem.
The files in /utils for example include there files with #include "utils/filename" and it doesn't work, because the file which includes them is already in the directory /utils.
It's the same with all directories...
Sorry, if this question is to silly, but what do I wrong?

Janek Sendrowski

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Janek Sendrowski (#3)
Re: /usr/bin/ld: cannot find [...] when compiling

"Janek Sendrowski" <janek12@web.de> writes:

Now the link editor is working, but I still have one problem.
The files in /utils for example include there files with #include "utils/filename" and it doesn't work, because the file which includes them is already in the directory /utils.

Could we see the exact code you're writing and the output of the "make"
attempt? (That is, I want to see both the gcc call and the error
message.) It should "just work", and you're not providing nearly
enough information to guess at what's wrong.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#5Janek Sendrowski
janek12@web.de
In reply to: Tom Lane (#4)
Re: /usr/bin/ld: cannot find [...] when compiling

The file test.c just inlcudes: #include "postgres.h".

root@ubuntu:/usr/include/postgresql/9.3/server# gcc test.c
In file included from postgres.h:48:0,
                 from test.c:1:
utils/elog.h:69:28: fatal error: utils/errcodes.h: No such file or directory
compilation terminated.

If elog.h file only includes "errcodes.h" without /utils, it's working.
It's the same With all files I'm including.

Makefile:
PROGRAM = test
DATA = test.c

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

root@ubuntu:/usr/include/postgresql/9.3/server# make
gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -fPIC -pie -I/usr/include/mit-krb5 -DLINUX_OOM_ADJ=0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -L/usr/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -L/usr/lib/mit-krb5 -L/usr/lib/i386-linux-gnu/mit-krb5 -L/usr/lib/i386-linux-gnu -Wl,--as-needed -lpgport -lpgcommon -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -ledit -lcrypt -ldl -lm -o test
/usr/bin/ld: cannot find -lxslt
/usr/bin/ld: cannot find -lxml2
/usr/bin/ld: cannot find -lpam
/usr/bin/ld: cannot find -ledit
collect2: ld returned 1 exit status
make: *** [test] Error 1

I don't know where to get these devel-packages.
Could I just reinstall the postgresql-server-dev-9.3 package?

Janek Sendrowski

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Janek Sendrowski (#5)
Re: /usr/bin/ld: cannot find [...] when compiling

"Janek Sendrowski" <janek12@web.de> writes:

The file test.c just inlcudes: #include "postgres.h".
root@ubuntu:/usr/include/postgresql/9.3/server# gcc test.c
In file included from postgres.h:48:0,
                 from test.c:1:
utils/elog.h:69:28: fatal error: utils/errcodes.h: No such file or directory
compilation terminated.

If elog.h file only includes "errcodes.h" without /utils, it's working.
It's the same With all files I'm including.

Makefile:
PROGRAM = test
DATA = test.c

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

root@ubuntu:/usr/include/postgresql/9.3/server# make
gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security -Werror=format-security -fPIC -pie -I/usr/include/mit-krb5 -DLINUX_OOM_ADJ=0 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -L/usr/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -L/usr/lib/mit-krb5 -L/usr/lib/i386-linux-gnu/mit-krb5 -L/usr/lib/i386-linux-gnu -Wl,--as-needed -lpgport -lpgcommon -lxslt -lxml2 -lpam -lssl -lcrypto -lkrb5 -lcom_err -lgssapi_krb5 -lz -ledit -lcrypt -ldl -lm -o test

It looks like the problem is that there aren't any Postgres-specific -I
flags in the make command. After a bit of poking around in the pgxs code
I think the reason why not is that you're using the PROGRAM target instead
of MODULES or MODULE_big. This might be a bug in our makefiles, but it's
also somewhat defensible, in that if you're building a standalone program
then you aren't going to have access to any server internal functions.

What's your actual goal here --- are you trying to build a server
extension or a standalone program? If the former, you should be using the
MODULES or MODULE_big targets. If the latter, you should probably be
including postgres_fe.h not postgres.h.

/usr/bin/ld: cannot find -lxslt
/usr/bin/ld: cannot find -lxml2
/usr/bin/ld: cannot find -lpam
/usr/bin/ld: cannot find -ledit
collect2: ld returned 1 exit status
make: *** [test] Error 1

I don't know where to get these devel-packages.

Since you let slip that you're using ubuntu, they probably have names
ending in -dev not -devel.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#6)
Re: /usr/bin/ld: cannot find [...] when compiling

I wrote:

"Janek Sendrowski" <janek12@web.de> writes:

Makefile:
PROGRAM = test
DATA = test.c

It looks like the problem is that there aren't any Postgres-specific -I
flags in the make command. After a bit of poking around in the pgxs code
I think the reason why not is that you're using the PROGRAM target instead
of MODULES or MODULE_big.

No, wait, I take that back. The problem with this makefile is you
need to say
OBJS = test.o
in order to tell the makefile what files PROGRAM is built from. It seems
pretty unlikely that "DATA = test.c" is what you want, either.

Having said that, I'm still not sure that PROGRAM is really the final
target you want.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#8Janek Sendrowski
janek12@web.de
In reply to: Tom Lane (#7)
Re: /usr/bin/ld: cannot find [...] when compiling

Now it's working.
My Makefile:

OBJS = test.o
MODULES = test
DATA = test.c

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

Is it possible to execute the code just like this?
I like to do that for Debugging.
I can't execute the .so files, of course and If I just do "gcc filename", I have the issue with the includes.

Janek Sendrowski

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Janek Sendrowski (#8)
Re: /usr/bin/ld: cannot find [...] when compiling

"Janek Sendrowski" <janek12@web.de> writes:

Is it possible to execute the code just like this?
I like to do that for Debugging.
I can't execute the .so files, of course and If I just do "gcc filename", I have the issue with the includes.

No, if it's a backend extension there's no way to execute it standalone.

regards, tom lane

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general