【问题标题】:Force linking a static library into a shared one with Libtool使用 Libtool 强制将静态库链接到共享库
【发布时间】:2012-06-06 06:17:28
【问题描述】:

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

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

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

我在 autotools 环境中,所以我必须使用标准的 configure.in 或 Makefile.am 规则来解决这个问题。 p>

我尝试了几件事,例如在 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 知识来单独解决这个问题。我一直无法在网上找到有关它的信息,总是略有不同的问题。

【问题讨论】:

    标签: static shared autotools libtool


    【解决方案1】:

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

    LT_INIT([disable-shared])
    

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

    【讨论】:

    • 没有 libtool 你是怎么做到的?
    【解决方案2】:

    您或许可以使用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
    

    【讨论】:

    • 这是正确的解决方案。只是为了完整起见,便利库被编译为 static 而不管给出什么配置标志。至少在 Unix 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多