[GRASS5] CVS version of grass5 failing to compile nviz & r.in.gdal because of -ldl flag

Glynn Clements glynn.clements at virgin.net
Mon Nov 18 23:53:26 EST 2002

Scott W Mitchell wrote:

> Just tried to compile today's CVS version of GRASS5 (is CVS HEAD the 
> right terminology if I've just checked out / updated the grass 
> directory without specifying any tags?) so I could get the "history 
> with r.mapcalc" working.  I've posted separately about the fact that 
> r.mapcalc itself won't compile on my Linux box.
> But here on my Darwin/MacOS X machine, everything apparently compiled 
> (including r.mapcalc, and it's recording the formulae used now - yay !  
> Thanks, Glynn !) except for r.in.gdal and NVIZ 2.2.
> Digging deeper, the error was the same in both cases - when it tries to 
> link everything together there's a lib flag for the DL library (-ldl) 
> and libdl isn't found.  IF I understand correctly (and that's a big 
> if), libopen() etc are provided by dlcompat in this OS so there is no 
> such DL library.
> So... I tracked down the -ldl call to the head file, and just made the 
> DLLIB variable empty in my copy of head.powerpc-apple-darwin6.1 - and 
> then tried to compile NVIZ and it does so without an error.
> Is that the appropriate fix ?  NVIZ seems to be working now, anyways.
> For some reason, taking the DLLIB definition away doesn't stop the 
> compile for r.in.gdal from trying to load libdl so I still have that 
> error, but will keep digging for it...

1. The use of $(DLLIB) by NVIZ is gratuitous; the NVWISH2.2 binary
doesn't directly call dlopen() etc.

It's possible that one of the libraries against which NVIZ is linked
may require libdl on some platforms; however, that should be handled
by configure when detecting the library in question (libtcl and libGL
are both candidates; configure *does* check for $DLLIB when checking

2. r.in.gdal *does* use dlopen() unless you use the --with-gdal
configure switch. However, this is handled by configure, which adds
$DLLIB to GDAL_LIBS where appropriate (i.e. when you aren't using

3. However, neither of the above should really matter, because DLLIB
should be empty unless configure actually finds dlsym() in libdl.
Specifically, configure:

a) checks whether dlsym() is available without any additional
switches; if it is, then DLLIB is set to empty.

b) otherwise, it checks whether dlsym() is available when linking
against the "dl" library (i.e. with "-ldl"); if it is, then DLLIB is
set to "-ldl".

c) otherwise, DLLIB is set to empty.

The resulting value of DLLIB is used in the rest of the configure
script, and is substituted when converting src/CMD/head/head.in into
src/CMD/head/head (which is later renamed to e.g. 

So, I'm curious as to why configure decided to set DLLIB to "-ldl" if
you don't have a library with that name.

Glynn Clements <glynn.clements at virgin.net>

More information about the grass-dev mailing list