Autoconf, Automake, and Libtool: Using Convenience Libraries

| ### 10.4.2 Using Convenience Libraries To rebuild ``libtrim'` as a convenience library (see section Creating Convenience Libraries), use the following commands:
    $ rm hello *.la
    $ ls
    hello.c   hello.lo   hello.o   main.c   trim.c   trim.lo   trim.o
    $ libtool gcc -o libtrim.la trim.lo
    rm -fr .libs/libtrim.la .libs/libtrim.* .libs/libtrim.*
    ar cru .libs/libtrim.al trim.lo
    ranlib .libs/libtrim.al
    creating libtrim.la
    (cd .libs && rm -f libtrim.la && ln -s ../libtrim.la libtrim.la)
Then, rebuild ``libhello'`, with an inter-library dependency on ``libtrim'` (see section 10.4.1 Inter-library Dependencies), like this:
    $ libtool gcc -rpath `pwd`/_inst -o libhello.la hello.lo libtrim.la
    rm -fr .libs/libhello.la .libs/libhello.* .libs/libhello.*

    *** Warning: inter-library dependencies are not known to be supported.
    *** All declared inter-library dependencies are being dropped.
    *** The inter-library dependencies that have been dropped here will be
    *** automatically added whenever a program is linked with this library
    *** or is declared to -dlopen it.
    rm -fr .libs/libhello.lax
    mkdir .libs/libhello.lax
    rm -fr .libs/libhello.lax/libtrim.al
    mkdir .libs/libhello.lax/libtrim.al
    (cd .libs/libhello.lax/libtrim.al && ar x /tmp/./.libs/libtrim.al)
    /opt/gcc-lib/hp821/2.7.0/ld -b +h libhello.sl.0 +b /tmp/hello/_inst \
    -o .libs/libhello.sl.0.0  hello.lo .libs/libhello.lax/libtrim.al/trim.lo
    (cd .libs && rm -f libhello.sl.0 && ln -s libhello.sl.0.0 libhello.sl.0)
    (cd .libs && rm -f libhello.sl && ln -s libhello.sl.0.0 libhello.sl)
    rm -fr .libs/libhello.lax
    mkdir .libs/libhello.lax
    rm -fr .libs/libhello.lax/libtrim.al
    mkdir .libs/libhello.lax/libtrim.al
    (cd .libs/libhello.lax/libtrim.al && ar x /tmp/hello/./.libs/libtrim.al)
    ar cru .libs/libhello.a  hello.o  .libs/libhello.lax/libtrim.al/trim.lo
    ranlib .libs/libhello.a
    rm -fr .libs/libhello.lax .libs/libhello.lax
    creating libhello.la
    (cd .libs && rm -f libhello.la && ln -s ../libhello.la libhello.la)
    $ ls
    hello.c    hello.o       libtrim.la   trim.c    trim.o
    hello.lo   libhello.la   main.c       trim.lo
Compare this to the previous example of building ``libhello'` and you can see that things are rather different. On HP-UX, partial linking is not known to work, so `libtool` extracts the objects from the convenience library, and links them directly into ``libhello'`. That is, ``libhello'` is comprised of its own objects and the objects in ``libtrim'`. If ``libtrim'` had had any dependencies, ``libhello'` would have inherited them too. This technique is especially useful for grouping source files into subdirectories, even though all of the objects compiled in the subdirectories must eventually reside in a big library: compile the sources in each into a convenience library, and in turn link all of these into a single library which will then contain all of the constituent objects and dependencies of the various convenience libraries. When you relink the `hello` executable, notice that ``libtrim'` is not linked, because the ``libtrim'` objects are already present in ``libhello'`:
    $ libtool gcc -o hello main.c libhello.la
    libtool: link: warning: this platform does not like uninstalled
    libtool: link: warning: shared libraries
    libtool: link: hello will be relinked during installation
    gcc -o .libs/hello main.c /tmp/intro-hello/.libs/libhello.sl \
    -Wl,+b -Wl,/tmp/intro-hello/.libs:/usr/local/lib
    creating hello
    $ ./hello
    Hello, World!

This document was generated by Gary V. Vaughan on February, 8 2006 using texi2html