transitive shared library dependencies and installation

[email protected]
Newsgroups gmane.comp.gnu.libtool.general
Message-ID <[email protected]>
Hi,

I'm experimenting with the attached skeleton project on a Debian buster
system (autoconf 2.69-11, automake 1:1.16.1-4 and libtool 2.4.6-9):

$ autoreconf -f -i
$ ./configure --prefix=/tmp/translib
$ make
$ ./translib; echo $?
6
$ make install
make[1]: Entering directory '/home/wferi/ha/pacemaker/translib'
 /bin/mkdir -p '/tmp/translib/lib'
 /bin/bash ./libtool   --mode=install /usr/bin/install -c   a/liba.la b/libb.la '/tmp/translib/lib'
libtool: warning: relinking 'a/liba.la'
libtool: install: (cd /home/wferi/ha/pacemaker/translib; /bin/bash "/home/wferi/ha/pacemaker/translib/libtool"  --tag CC --mode=relink gcc -g -O2 -avoid-version -o a/liba.la -rpath /tmp/translib/lib a/a.lo b/libb.la )
libtool: relink: gcc -shared  -fPIC -DPIC  a/.libs/a.o   -Wl,-rpath -Wl,/tmp/translib/lib -L/tmp/translib/lib -lb  -g -O2   -Wl,-soname -Wl,liba.so -o a/.libs/liba.so
/usr/bin/ld: cannot find -lb
collect2: error: ld returned 1 exit status
libtool:   error: error: relink 'a/liba.la' with the above command before installing it
make[1]: *** [Makefile:446: install-libLTLIBRARIES] Error 1
make[1]: Leaving directory '/home/wferi/ha/pacemaker/translib'
make: *** [Makefile:798: install-am] Error 2

No cyclic dependencies here, so this can be worked around by

-lib_LTLIBRARIES = a/liba.la b/libb.la
+lib_LTLIBRARIES = b/libb.la a/liba.la

in this case; is this expected (and documented) behavior?

Anyway: if, after a successful installation, I introduce a new symbol
(b2) in libb

diff --git a/a/a.c b/a/a.c
index ffc6553..8edd6f5 100644
--- a/a/a.c
+++ b/a/a.c
@@ -3,5 +3,5 @@
 
 int a (int x)
 {
-    return b(x)+1;
+    return b(x)+b2(x)+1;
 }
diff --git a/b/b.c b/b/b.c
index 27bd35f..a723efc 100644
--- a/b/b.c
+++ b/b/b.c
@@ -4,3 +4,8 @@ int b (int x)
 {
     return x+2;
 }
+
+int b2 (int x)
+{
+    return x+3;
+}
diff --git a/b/b.h b/b/b.h
index 2290498..c0ea0fb 100644
--- a/b/b.h
+++ b/b/b.h
@@ -1 +1,2 @@
 int b (int x);
+int b2 (int x);

and use it from liba, linking the final binary fails:

$ make
[...]
/bin/bash ./libtool  --tag=CC   --mode=link gcc  -g -O2 -avoid-version  -o translib translib.o a/liba.la 
libtool: link: gcc -g -O2 -o .libs/translib translib.o  a/.libs/liba.so -Wl,-rpath -Wl,/tmp/translib/lib
/usr/bin/ld: a/.libs/liba.so: undefined reference to `b2'

As I understand it, the -rpath linker option on the above command makes
a/.libs/liba.so use the already installed (old) version of libb, which
lacks the b2 symbol.  What's the solution here?  Why isn't that -rpath
option "delayed" until the relinking phase?
-- 
Thanks,
Feri
translib.tgz (application/x-gtar-compressed, 748 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.