使用Libtool将静态库强制链接到共享库中

12

我有一个名为libfoo的库,使用libtool编译成两个对象:libfoo.a和libfoo.so。

我需要创建另一个库(libbar),也要使用libtool,它将是一个包含所有libfoo代码的单个共享库(libbar.so)。

为此,我必须强制libbar链接到libfoo.a,而不是使用libfoo.so。

我处在一个autotools环境中,所以我必须使用标准的configure.inMakefile.am规则来解决这个问题。

我尝试了几种方法,比如在configure.in文件中:

LDFLAGS="$LDFLAGS "-Wl,-Bstatic -lfoo -Wl,-Bdynamic"

这总是导致链接行上的-Wl标志;但-lfoo已经消失并被以绝对路径形式(/opt/foo/lib/libfoo.so)放置在其开头。

我还尝试过:

LDFLAGS="$LDFLAGS "-L/opt/foo/lib libfoo.a"

或者在Makefile.am中:

libbar_la_LDADD = -Wl,-Bstatic -lfoo -Wl,-Bdynamic

并且

libbar_la_LTLIBRARIES = libfoo.a

等等等等(有很多,很多变体!)

但我认为我绝对没有足够的Autotools / Libtool知识来独自解决这个问题。我在网上找不到相关信息,每次遇到的问题都略有不同。

2个回答

7
你可能需要使用一个方便库。方便库是中间静态库,不会被安装。你可以使用前缀noinst来构建一个。
noinst_LTLIBRARIES = libfoo_impl.la

lib_LTLIBRARIES = libfoo.la libbar.la
libfoo_la_LIBADD = libfoo_impl.la
libbar_la_LIBADD = libfoo_impl.la

这是正确的解决方案。仅为完整起见,无论给出了什么配置标志,方便库都将编译为静态。至少在Unix上是这样的。 - Jan Včelák

4

标准做法是使用--disable-shared选项构建libfoo。链接静态库还是动态库是用户自己决定的,因此作为软件包维护者无法强制执行,但您可以设置libbar的配置文件,在libfoo.so存在时失败(我不确定如何干净地做到这一点,并且认为这是一个坏主意,因为这确实是用户的选择)。我认为最好的方法是让用户使用--disable-shared选项构建libfoo,但您可以通过在libfoo/configure.ac中仅指定静态库来强制进行此选择:

LT_INIT([disable-shared])

请注意,如果您这样做,将无法将libfoo构建为共享库。也许这就是您想要的结果。

你是如何在没有使用Libtool的情况下完成它的? - Janus Troelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接