manpagez: man pages & more
info libtool
Home | html | info | man

File: libtool.info,  Node: Inter-library dependencies,  Next: Dlopened modules,  Prev: Library tips,  Up: Top

9 Inter-library dependencies
****************************

By definition, every shared library system provides a way for
executables to depend on libraries, so that symbol resolution is
deferred until runtime.

   An “inter-library dependency” is where a library depends on other
libraries.  For example, if the libtool library ‘libhello’ uses the
‘cos’ function, then it has an inter-library dependency on ‘libm’, the
math library that implements ‘cos’.

   Some shared library systems provide this feature in an
internally-consistent way: these systems allow chains of dependencies of
potentially infinite length.

   However, most shared library systems are restricted in that they only
allow a single level of dependencies.  In these systems, programs may
depend on shared libraries, but shared libraries may not depend on other
shared libraries.

   In any event, libtool provides a simple mechanism for you to declare
inter-library dependencies: for every library ‘libNAME’ that your own
library depends on, simply add a corresponding ‘-lNAME’ option to the
link line when you create your library.  To make an example of our
‘libhello’ that depends on ‘libm’:

     burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
                     -rpath /usr/local/lib -lm
     burger$

   When you link a program against ‘libhello’, you don't need to specify
the same ‘-l’ options again: libtool will do that for you, to guarantee
that all the required libraries are found.  This restriction is only
necessary to preserve compatibility with static library systems and
simple dynamic library systems.

   Some platforms, such as Windows, do not even allow you this
flexibility.  In order to build a shared library, it must be entirely
self-contained or it must have dependencies known at link time (that is,
have references only to symbols that are found in the ‘.lo’ files or the
specified ‘-l’ libraries), and you need to specify the ‘-no-undefined’
flag.  By default, libtool builds only static libraries on these kinds
of platforms.

   The simple-minded inter-library dependency tracking code of libtool
releases prior to 1.2 was disabled because it was not clear when it was
possible to link one library with another, and complex failures would
occur.  A more complex implementation of this concept was re-introduced
before release 1.3, but it has not been ported to all platforms that
libtool supports.  The default, conservative behavior is to avoid
linking one library with another, introducing their inter-dependencies
only when a program is linked with them.

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.