我有一个库( 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。我无法在网上找到有关它的信息,总是略有不同的问题。
答案 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
构建为共享库。也许这就是你想要的。