libtool
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

interdependancies between libraries


From: Brian May
Subject: interdependancies between libraries
Date: 16 Jan 2001 13:50:57 +1100
User-agent: Gnus/5.0807 (Gnus v5.8.7) XEmacs/21.1 (Capitol Reef)

Hello,

I am experimenting with the CVS version of libtool (AFAIK pre-release
versions of 1.4), and am I bit disappointed in how interdependencies
between shared libraries are handled.

As an example:

/bin/sh ./libtool --mode=link gcc  -g -O2   -o depdemo  main.o ./l1/libl1.la 
./l2/libl2.la ./l4/libl4.la 
gcc -g -O2 -o .libs/depdemo main.o  ./l1/.libs/libl1.so ./l2/.libs/libl2.so 
./l4/.libs/libl4.so /home/bam/source/cvs/libtool/depdemo/l3/.libs/libl3.so 
/home/bam/source/cvs/libtool/depdemo/l2/.libs/libl2.so 
/home/bam/source/cvs/libtool/depdemo/l1/.libs/libl1.so -lm -Wl,--rpath 
-Wl,/usr/local/lib -Wl,--rpath -Wl,/usr/local/lib/extra
creating depdemo

libtool still doesn't understand that it doesn't need to link in
libl3, because the operating system knows that libl4 depends on libl3:

make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo'
[577] [snoopy:bam] ~/source/cvs/libtool/depdemo >ldd l4/.libs/libl4.so
        libl3.so.0 => /home/bam/source/cvs/libtool/depdemo/l3/.libs/libl3.so.0 
(0x40002000)
        libm.so.6 => /lib/libm.so.6 (0x4000b000)
        libc.so.6 => /lib/libc.so.6 (0x40028000)
        libl1.so.0 => /home/bam/source/cvs/libtool/depdemo/l1/.libs/libl1.so.0 
(0x40106000)
        libl2.so.0 => /home/bam/source/cvs/libtool/depdemo/l2/.libs/libl2.so.0 
(0x40108000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaaa000)


This has major implications for packaging systems, like Debian, as in
order to build depdemo (lets continue with the same example) the
development files for libl3 are required even though depdemo never
refers to it.

To make matters worse, a future version of libl4 could depend on libl5
instead, meaning all executables (depdemo) have to be recompiled. This
is despite the fact that depdemo doesn't have any references to libl3,
and libl4 only needs libl3 to support internal functions.

(the same thing applies with the libraries too, libl4 shouldn't need
to depend on libl1, as both libl2 and libl3 do).

I can provide real-life examples on request, but think (hope!) this
way might be easier to understand.


Oh, another observation: installing the libraries in their non-final
location (as required for Debian packaging tools, probably Redhat too)
simply does not work, as shown below. I think some of the required -L
options to the linker might be missing.

[589] [snoopy:bam] ~/source/cvs/libtool/depdemo >make install
Making install in l1
make[1]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l1'
make[2]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l1'
/bin/sh ../../mkinstalldirs /home/bam/source/cvs/libtool/depdemo/a/lib
mkdir /home/bam/source/cvs/libtool/depdemo/a
mkdir /home/bam/source/cvs/libtool/depdemo/a/lib
 /bin/sh ../libtool  --mode=install /usr/bin/install -c  libl1.la 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl1.la
/usr/bin/install -c .libs/libl1.so.0.0.0 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl1.so.0.0.0
(cd /home/bam/source/cvs/libtool/depdemo/a/lib && rm -f libl1.so.0 && ln -s 
libl1.so.0.0.0 libl1.so.0)
(cd /home/bam/source/cvs/libtool/depdemo/a/lib && rm -f libl1.so && ln -s 
libl1.so.0.0.0 libl1.so)
/usr/bin/install -c .libs/libl1.lai 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl1.la
/usr/bin/install -c .libs/libl1.a 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl1.a
ranlib /home/bam/source/cvs/libtool/depdemo/a/lib/libl1.a
chmod 644 /home/bam/source/cvs/libtool/depdemo/a/lib/libl1.a
libtool: install: warning: remember to run `libtool --finish /usr/local/lib'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l1'
make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l1'
Making install in l2
make[1]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l2'
make[2]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l2'
/bin/sh ../../mkinstalldirs /home/bam/source/cvs/libtool/depdemo/a/lib
 /bin/sh ../libtool  --mode=install /usr/bin/install -c  libl2.la 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl2.la
libtool: install: warning: relinking `libl2.la'
cd /home/bam/source/cvs/libtool/depdemo/l2; /bin/sh ../libtool --mode=relink 
gcc -g -O2 -o libl2.la -rpath /usr/local/lib l2.lo ../l1/libl1.la
gcc -shared  l2.lo  -Wl,--rpath -Wl,/usr/local/lib  -L/usr/local/lib -ll1   
-Wl,-soname -Wl,libl2.so.0 -o .libs/libl2.so.0.0.0
/usr/bin/ld: cannot find -ll1
collect2: ld returned 1 exit status
libtool: install: error: relink `libl2.la' with the above command before 
installing it
libtool: install: warning: remember to run `libtool --finish /usr/local/lib'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l2'
make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l2'
Making install in l3
make[1]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l3'
make[2]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l3'
make[2]: Nothing to be done for `install-exec-am'.
/bin/sh ../../mkinstalldirs /home/bam/source/cvs/libtool/depdemo/a/lib/extra
mkdir /home/bam/source/cvs/libtool/depdemo/a/lib/extra
 /bin/sh ../libtool  --mode=install /usr/bin/install -c  libl3.la 
/home/bam/source/cvs/libtool/depdemo/a/lib/extra/libl3.la
libtool: install: warning: relinking `libl3.la'
cd /home/bam/source/cvs/libtool/depdemo/l3; /bin/sh ../libtool --mode=relink 
gcc -g -O2 -o libl3.la -rpath /usr/local/lib/extra l3.lo ../l1/libl1.la 
../l2/libl2.la
gcc -shared  l3.lo  -Wl,--rpath -Wl,/usr/local/lib  
-L/home/bam/source/cvs/libtool/depdemo/l1/.libs -L/usr/local/lib -ll1 -ll2    
-Wl,-soname -Wl,libl3.so.0 -o .libs/libl3.so.0.0.0
/usr/bin/ld: cannot find -ll2
collect2: ld returned 1 exit status
libtool: install: error: relink `libl3.la' with the above command before 
installing it
libtool: install: warning: remember to run `libtool --finish 
/usr/local/lib/extra'
make[2]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l3'
make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l3'
Making install in l4
make[1]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l4'
make[2]: Entering directory `/home/bam/source/cvs/libtool/depdemo/l4'
/bin/sh ../../mkinstalldirs /home/bam/source/cvs/libtool/depdemo/a/lib
 /bin/sh ../libtool  --mode=install /usr/bin/install -c  libl4.la 
/home/bam/source/cvs/libtool/depdemo/a/lib/libl4.la
libtool: install: warning: relinking `libl4.la'
cd /home/bam/source/cvs/libtool/depdemo/l4; /bin/sh ../libtool --mode=relink 
gcc -g -O2 -o libl4.la -rpath /usr/local/lib l4.lo ../l3/libl3.la -lm
gcc -shared  l4.lo  -Wl,--rpath -Wl,/usr/local/lib/extra  
-L/home/bam/source/cvs/libtool/depdemo/l1/.libs 
-L/home/bam/source/cvs/libtool/depdemo/l2/.libs -L/usr/local/lib/extra -ll3 -lm 
  -Wl,-soname -Wl,libl4.so.0 -o .libs/libl4.so.0.0.0
/usr/bin/ld: cannot find -ll3
collect2: ld returned 1 exit status
libtool: install: error: relink `libl4.la' with the above command before 
installing it
libtool: install: warning: remember to run `libtool --finish /usr/local/lib'
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l4'
make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo/l4'
make[1]: Entering directory `/home/bam/source/cvs/libtool/depdemo'
make[2]: Entering directory `/home/bam/source/cvs/libtool/depdemo'
/bin/sh ./../mkinstalldirs /home/bam/source/cvs/libtool/depdemo/a/bin
mkdir /home/bam/source/cvs/libtool/depdemo/a/bin
 /bin/sh ./libtool  --mode=install /usr/bin/install -c  depdemo 
/home/bam/source/cvs/libtool/depdemo/a/bin/depdemo
libtool: install: warning: `./l1/libl1.la' has not been installed in 
`/usr/local/lib'
libtool: install: warning: `./l2/libl2.la' has not been installed in 
`/usr/local/lib'
libtool: install: warning: `./l4/libl4.la' has not been installed in 
`/usr/local/lib'
libtool: install: warning: `/home/bam/source/cvs/libtool/depdemo/l3/libl3.la' 
has not been installed in `/usr/local/lib/extra'
libtool: install: warning: `/home/bam/source/cvs/libtool/depdemo/l2/libl2.la' 
has not been installed in `/usr/local/lib'
libtool: install: warning: `/home/bam/source/cvs/libtool/depdemo/l1/libl1.la' 
has not been installed in `/usr/local/lib'
/usr/bin/install -c .libs/depdemo 
/home/bam/source/cvs/libtool/depdemo/a/bin/depdemo
 /bin/sh ./libtool  --mode=install /usr/bin/install -c  depdemo.static 
/home/bam/source/cvs/libtool/depdemo/a/bin/depdemo.static
/usr/bin/install -c depdemo.static 
/home/bam/source/cvs/libtool/depdemo/a/bin/depdemo.static
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/bam/source/cvs/libtool/depdemo'
make[1]: Leaving directory `/home/bam/source/cvs/libtool/depdemo'

(It took me awhile to notice that errors occurred, shouldn't it stop
straight away? Maybe thats my fault for using CVS versions of autoconf
and automake).

Comments anyone?
-- 
Brian May <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]