在Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool一书中,第 6 章(使用 libtool 构建库)中给出了链接库的示例。
在示例中,一个库libjupiter.so链接到另一个库libjupcommon.a。第一次尝试失败,因为libjupiter.so需要 PIC,但libjupcommon.a不是。作者添加libjupcommon_a_CFLAGS = -fPIC以修复它。它变得更好了,但是'将共享库 libjupiter.la 与静态库 ../common/libjupcommon.a 链接起来的警告不可移植!'出现。
因此作者再次修改了 Makefile.am 的,使用 libtool 来构建libjupcommon.la。的libjupiter链接libjupcommon.la。像这样:
noinst_LTLIBRARIES = libjupcommon.la
libjupcommon_la_SOURCES = jupcommon.h print.c
和
...
libjupiter_la_LIBADD = ../common/libjupcommon.la
这次一切正常。
现在,我的问题:
我有一个图书馆需要另一个图书馆,就像libjupiter需要一样libjupcommon。不同之处在于我libjupcommon来自另一个项目并安装到系统中。它不是一个noinst_LTLIBRARIES. .so和.a版本都存在。当我尝试链接libjupcommon.la示例显示的内容时,.so选择了 ,但我不想要动态链接关系。我想链接到.a,就像书中的例子一样。
显式链接.a(通过使用 _LIBADD=.a 文件)提供了一个可用的库,但给出了“...不可移植”的警告。
.a在这种情况下实现链接的正确方法是什么?
PS:从本书的官方网站下载示例。在autotools/book/jupiter-libtool-ch6/common中,将 Makefile.am 修改noinst_LTLIBRARIES为lib_LTLIBRARIES应该与我的问题非常相似。