In the book Autotools: A Practioner’s Guide to GNU Autoconf, Automake, and Libtool, chapter 6 (building libraries with libtool), an example of linking library is given.
In the example, a library libjupiter.so is linked to another library libjupcommon.a. The first attempt fails because libjupiter.so needs PIC, but libjupcommon.a is not. The author adds libjupcommon_a_CFLAGS = -fPIC to fix it. It gets much better, but the warning of ‘Linking the shared library libjupiter.la against the static library ../common/libjupcommon.a is not portable!‘ appears.
Therefore the author modifies the Makefile.am’s again, using libtool to build libjupcommon.la. The libjupiter links to the libjupcommon.la.
Like this:
noinst_LTLIBRARIES = libjupcommon.la
libjupcommon_la_SOURCES = jupcommon.h print.c
and
…
libjupiter_la_LIBADD = ../common/libjupcommon.la
This time everything’s OK.
Now, my problem:
I have a library needs another library, just like libjupiter needs libjupcommon. The difference is my libjupcommon is from another project and installed into the system. It is not a noinst_LTLIBRARIES. Both .so and .a version exist. When I try to link the libjupcommon.la like the example shows, the .so is chosen, but I don’t want a dynamic linking relationship. I want to link to the .a, like the example in the book.
Linking to .a explicitly (by using _LIBADD=the .a file) gives a usable library, but the warning of ‘… not portable’ is given.
What’s the proper way to achieve linking to the .a in this case?
PS: Download the example from the book’s official site. In autotools/book/jupiter-libtool-ch6/common, modify the Makefile.am’s noinst_LTLIBRARIES to lib_LTLIBRARIES should be a close mimic to my problem.
There’s a couple things you could try. You could try running
configurewith the--disable-sharedoption to turn off compilation of shared libs (and add the static lib tolibfoo_LIBADDagain). You could try adding-statictolibfoo_LDFLAGSto get libtool to build it statically (again with the static lib added tolibfoo_LIBADD).EDIT: Since both static and shared libs are needed the above won’t work.
Try adding:
to configure.ac.