[PPL-devel] Problem with plld?

Roberto Bagnara bagnara at cs.unipr.it
Fri Nov 4 21:04:44 CET 2005


I am having a problem with `plld' on one machine.
The problem is there I get undefined references to symbols
of the readline library, which is installed in the system:

$ plld -cc gcc -c++ g++ -ld g++ -o ppl_pl ppl_swiprolog.o ppl_pl.o \
         -L../../../src/.libs -lppl \
         -L../../../Watchdog/src/.libs -lpwl \
          -lm -lgmpxx -lgmp
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x33): In function `PL_install_readline':
pl-rl.c: undefined reference to `rl_readline_name'
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x3d):pl-rl.c: undefined reference to `rl_attempted_completion_function'
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x47):pl-rl.c: undefined reference to `rl_basic_word_break_characters'
...

If I add an explicit "-lreadline", then linking succeeds:

$ plld -cc gcc -c++ g++ -ld g++ -o ppl_pl ppl_swiprolog.o ppl_pl.o \
         -L../../../src/.libs -lppl \
         -L../../../Watchdog/src/.libs -lpwl \
         -lm -lgmpxx -lgmp -lreadline
% halt

The problem seems to be here:

$ pl -dump-runtime-variables CC="gcc"; PLBASE="/usr/lib/pl-5.4.7";
PLARCH="i686-linux";
PLLIBS="-ldl /usr/lib/libreadline.a -lncurses -lncurses -lm -lrt ";
PLLIB="-lpl";
PLLDFLAGS="-export-dynamic  -O3 -pthread";
PLSOEXT="so";
PLVERSION="50407";
PLSHARED="yes";
PLTHREADS="yes";

I have no idea why we have "/usr/lib/libreadline.a" instead of "-lreadline"
in  `PLLIBS'.  In fact we get:

$ plld -v -cc gcc -c++ g++ -ld g++ -o ppl_pl ppl_swiprolog.o ppl_pl.o -L../../../src/.libs -lppl -L../../../Watchdog/src/.libs -lpwl -lm -lgmpxx -lgmp         eval `pl -dump-runtime-variables`
                 CC="gcc"
                 PLBASE="/usr/lib/pl-5.4.7"
                 PLARCH="i686-linux"
                 PLLIBS="-ldl /usr/lib/libreadline.a -lncurses -lncurses -lm -lrt"
                 PLLIB="-lpl"
                 PLLDFLAGS="-export-dynamic  -O3 -pthread"
                 PLSOEXT="so"
                 PLTHREADS="yes"
         g++ -o ppl_pl -export-dynamic  -O3 -pthread ppl_swiprolog.o ppl_pl.o /usr/lib/libreadline.a -L/usr/lib/pl-5.4.7/lib/i686-linux -L../../../src/.libs -L../../../Watchdog/src/.libs -lpl -lppl -lpwl -lm -lgmpxx -lgmp -ldl -lncurses -lncurses -lm -lrt
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x33): In function `PL_install_readline':
pl-rl.c: undefined reference to `rl_readline_name'
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x3d):pl-rl.c: undefined reference to `rl_attempted_completion_function'
/usr/lib/pl-5.4.7/lib/i686-linux/libpl.a(pl-rl.o)(.text+0x47):pl-rl.c: undefined reference to `rl_basic_word_break_characters'
...

So, either "-lreadline" should be used instead of "/usr/lib/libreadline.a",
or "/usr/lib/libreadline.a" should be put after "-lpl" in the link command.
In both cases, this would seem to be a bug in SWI-Prolog 5.4.7.
All the best,

    Roberto

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it



More information about the PPL-devel mailing list