在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
应该与我的问题非常相似。