在书Autotools: A Practioner's Guide to GNU Autoconf, Automake, and Libtool的第6章(使用libtool构建库)中,给出了链接库的example。如何链接到libabc.a而不是libabc.so?
在该示例中,库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
的正确方法是什么?请参考book's official site。在autotools/book/jupiter-libtool-ch6/common
中,将Makefile.am的noinst_LTLIBRARIES
修改为lib_LTLIBRARIES
应该与我的问题很接近。
你想建立什么样的图书馆?共享库或静态库?如果您正在构建共享库,那么与已安装的'.a'库链接是没有意义的,因此libtoool警告。如果你正在构建一个静态库,你应该明确声明(参见ldav1s的答案)。 – adl
我想建立一个共享库。即使安装的'.a'是PIC也没有意义?为什么这样? –
但是在这种情况下,'.a'不是由Libtool生成的。据我所知,Libtool安装的'.a'文件不是PIC。 – adl