12

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

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

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

我在一个自动工具环境中,所以我必须使用标准的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 知识来单独解决这个问题。我一直无法在网上找到有关它的信息,总是略有不同的问题。

4

2 回答 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
于 2012-12-20T19:09:44.380 回答
4

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

LT_INIT([disable-shared])

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

于 2012-06-01T14:48:07.177 回答