Hi, I build using "-static" given to libtool when creating executables, to link statically with our own libraries, but dynamically against system libraries. Works nicely, except one small problem.
One library, lets call it "libstat", I always want to compile static and install in the more private "pkglib" directory. But it is also to be used in the build itself as a libtool convenience library, when creating other shared libraries and executables. Problem is, I also want to create another shared library "libdyn" that use objects in "libstat". I have included a small test setup below. What happens is that the executable gets a dependency on "libstat.so.0", something I don't want and that I thought "-static" when linking the executable took care of. If I change from 'pkglib_LTLIBRARIES' to 'noinst_LTLIBRARIES' in "libstatdir/Makefile.am" the dependency goes away, but I do want to install the library, at least the static version of it. So I go use "libstat_la_LDFLAGS = -static" but this has the effect of just producing a non position independent static library, i.e. no libtool convenience library is created (even if placed in ".libs"). And when linking the "libdyn" library, the linker on AMD64 will complain gcc -shared .libs/libdyn.o ../libstatdir/.libs/libstat.a -Wl,-soname -Wl,libdyn.so.0 -o .libs/libdyn.so.0.0.0 /usr/bin/ld: ../libstatdir/.libs/libstat.a(libstat.o): relocation R_X86_64_32 against \ `a local symbol' can not be used when making a shared object; recompile with -fPIC So how do I make all these happen? - The executable to link statically against the objects from "libstat". - The shared library "libdyn" link against the libtool convenience library in such a way it has no "libstat.so" dependency, but includes the objects from "libstat" (position independent of course). - The static library "libstat.a" is installed when "make install", but not a shared version. Or to put the question differently, when using a convenience library, can I control if the static or shared library is installed? And if static or shared linking is used when referenced from other parts of the build, both references from building executables and other libraries? I'm using libtool 1.5.22 automake 1.9.6 autoconf 2.60 I highly appreciate any help or pointers, kent ==== DO ==== aclocal libtoolize --automake --force --copy automake --add-missing --force --copy autoconf ./configure ; make clean ; make for f in `find exedir -name exebin`; do echo "**** Running ldd on $f" ldd $f done for f in `find lib*dir -name "lib*.so"`; do echo "**** Running ldd on $f" ldd $f done for f in `find lib*dir -name "lib*.a"`; do echo "**** Found $f" done ==== configure.in ==== AC_INIT([exeproj], [1.0], [EMAIL PROTECTED]) AM_INIT_AUTOMAKE AC_PROG_LIBTOOL AC_CONFIG_FILES([Makefile exedir/Makefile libstatdir/Makefile libdyndir/Makefile]) AC_OUTPUT ==== Makefile.am ==== AUTOMAKE_OPTIONS = foreign SUBDIRS = libstatdir libdyndir exedir ==== exedir/Makefile.am ==== bin_PROGRAMS = exebin exebin_SOURCES = exefile.c exebin_LDADD = $(top_builddir)/libstatdir/libstat.la exebin_LADD = -static ==== libstatdir/Makefile.am ==== pkglib_LTLIBRARIES = libstat.la # If line below replaces first line, deps are right, but no install #noinst_LTLIBRARIES = libstat.la libstat_la_SOURCES = libstat.c # First and second try was without this line below libstat_la_LDFLAGS = -static ==== libdyndir/Makefile.am ==== pkglib_LTLIBRARIES = libdyn.la libdyn_la_SOURCES = libdyn.c libdyn_la_LIBADD = $(top_builddir)/libstatdir/libstat.la ==== exedir/exefile.c ==== extern int libstatfunc(void); int main() { return libstatfunc(); } ==== libstatdir/libstat.c ==== int libstatfunc(void) { return 42; } ==== libdyndir/libdyn.c ==== extern int libstatfunc(void); int libdynfunc(void) { return libstatfunc(); } -- Kent Boortz, Senior Software Developer MySQL AB, www.mysql.com Office: +46 18 174400 ext. 4450 (VoIP) Office: +46 19 182931 Mobile: +46 70 2791171