10.4.1 Inter-library Dependencies
libtool 's inter-library dependency support will use the native
implementation if there is one available. If there is no native
implementation, or if the native implementation is broken or incomplete,
libtool will use an implementation of its own.
To build `libtrim' as a standard Libtool library (see section 10.2 The Libtool Library), as follows:
| $ rm hello *.a *.o
$ ls
hello.c main.c trim.c
$ libtool gcc -c trim.c
rm -f .libs/trim.lo
gcc -c -fPIC -DPIC trim.c -o .libs/trim.lo
gcc -c trim.c -o trim.o >/dev/null 2>&1
mv -f .libs/trim.lo trim.lo
$ libtool gcc -rpath /usr/local/lib -o libtrim.la trim.lo
rm -fr .libs/libtrim.la .libs/libtrim.* .libs/libtrim.*
/opt/gcc-lib/hp821/2.7.0/ld -b +h libtrim.sl.0 +b /usr/local/lib \
-o .libs/libtrim.sl.0.0 trim.lo
(cd .libs && rm -f libtrim.sl.0 && ln -s libtrim.sl.0.0 libtrim.sl.0)
(cd .libs && rm -f libtrim.sl && ln -s libtrim.sl.0.0 libtrim.sl)
ar cru .libs/libtrim.a trim.o
ranlib .libs/libtrim.a
creating libtrim.la
(cd .libs && rm -f libtrim.la && ln -s ../libtrim.la libtrim.la)
|
When you build `libhello', you can specify the libraries it depends
on at the command line, like so:
| $ libtool gcc -c hello.c
rm -f .libs/hello.lo
gcc -c -fPIC -DPIC hello.c -o .libs/hello.lo
gcc -c hello.c -o hello.o >/dev/null 2>&1
mv -f .libs/hello.lo hello.lo
$ libtool gcc -rpath /usr/local/lib -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.
/opt/gcc-lib/hp821/2.7.0/ld -b +h libhello.sl.0 +b /usr/local/lib \
-o .libs/libhello.sl.0.0 hello.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)
ar cru .libs/libhello.a hello.o
ranlib .libs/libhello.a
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
|
Although, on HP-UX, libtool warns that it doesn't know
how to use the native inter-library dependency implementation, it will
track the dependencies and make sure they are added to the final link
line, so that you only need to specify the libraries that you use
directly.
Now, you can rebuild `hello' exactly as in the earlier example
(see section 10.3 Linking an Executable), as in:
| $ 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 \
/tmp/intro-hello/.libs/libtrim.sl \
-Wl,+b -Wl,/tmp/intro-hello/.libs:/usr/local/lib
creating hello
$ ./hello
Hello, World!
|
Notice that even though you only specified the `libhello.la'
library at the command line, libtool remembers that
`libhello.sl' depends on `libtrim.sl' and links that library
too.
You can also link a static executable, and the dependencies are handled
similarly:
| $ libtool gcc -o hello-again -static main.c libhello.la
gcc -o hello main.c ./.libs/libhello.a /tmp/intro-hello/.libs/libtrim.a
$ ./hello-again
Hello, World!
|
For your own projects, provided that you use libtool , and that
you specify the libraries you wish to link using the `.la'
pseudo-libraries, these dependencies can be nested as deeply as you
like. You can also register dependencies on native libraries, though
you will of course need to specify any dependencies that the native
library itself has at the same time.
|