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

vpe*_*ron 11 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"
Run Code Online (Sandbox Code Playgroud)

这总是会在链接行上产生-Wl标志; 但是-lfoo已经消失了,并且在它的开头被放置在绝对路径形式(/opt/foo/lib/libfoo.so)中.

我也尝试过:

LDFLAGS="$LDFLAGS "-L/opt/foo/lib libfoo.a"
Run Code Online (Sandbox Code Playgroud)

或者在Makefile.am中:

libbar_la_LDADD = -Wl,-Bstatic -lfoo -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)

和

libbar_la_LTLIBRARIES = libfoo.a
Run Code Online (Sandbox Code Playgroud)

等等(有很多很多变种!)

但我认为我绝对不具备Autotools/Libtool足够的知识来解决这个问题.我无法在网上找到有关它的信息,总是略有不同的问题.

tpr*_*k77 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
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 5

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

LT_INIT([disable-shared])
Run Code Online (Sandbox Code Playgroud)

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