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

时间:2012-06-01 00:19:55

标签: static shared autotools libtool

我有一个库( libfoo ),它使用libtool 编译成两个对象:libfoo.a和libfoo.so。

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

为了做到这一点,我必须强制 libbar 链接 libfoo.a ,而不是libfoo.so。

我在 autotools 环境中,因此我必须使用标准 configure.in Makefile.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 个答案:

答案 0 :(得分:5)

您可以使用convenience library。便捷库是未安装的中间静态库。您可以使用前缀noinst来构建一个。

noinst_LTLIBRARIES = libfoo_impl.la

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

答案 1 :(得分:3)

标准方法是使用libfoo构建--disable-shared。是静态链接还是动态链接是用户做出的决定,因此实际上没有办法强制它作为包维护者,但是如果存在libbar,您可以将libfoo.so的配置设置为失败(我不确定这样做的干净方法,并认为这是一个坏主意,因为它确实是用户的选择。)我认为最好的办法是让用户构建libfoo --disable-shared,但您可以通过仅在libfoo / configure.ac中指定静态库来强制执行该选择:

LT_INIT([disable-shared])

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