【问题标题】:Linking a shared library to a static libtool library using automake使用 automake 将共享库链接到静态 libtool 库
【发布时间】:2014-06-05 16:00:14
【问题描述】:

我有这个目录结构

prog/libA
prog/libB

在 libA 中,我有一个 Makefile.am,如下所示:

noinst_LTLIBRARIES = libA.la
libA_la_SOURCES = ...
libA_la_LIBADD = ... $(LAPACK)

其中 LAPACK 是我系统的 lapack 安装。这按预期工作。然而,在 libB 我有这个:

noinst_LTLIBRARIES = libB.la
bin_PROGRAMS = compLibB
libB_la_SOURCES = ...
compLibB_SOURCES = ...
libB_LIBADD = $(top_builddir)/libA/libA.la ...
compLibB_LDADD = libB.la

这不起作用。 compLibB 的链接阶段抱怨对 LAPACK 的未定义引用,除非我将最后一行更改为

compLibB_LDADD = libB.la $(LAPACK)

但这似乎是多余的。当我构建libA.la 便利库时,我不是已经链接到$(LAPACK) 了吗?它是不干净的,因为现在 compLibB 必须关注 libA 的细节。有没有办法在 libA 构建阶段链接 LAPACK 库,这样我就不必在 compLibB 构建阶段重新指定它?

【问题讨论】:

标签: automake libtool


【解决方案1】:

我在构建 libA.la 便利库时不是已经在 $(LAPACK) 中链接了吗?

正如您的链接器已经告诉您的那样,不。 libA.la 作为便利库有点像静态库(目标文件的集合)。

这是不干净的,因为现在 compLibB 必须关注 libA 的细节。有没有办法在 libA 构建阶段链接 LAPACK 库,这样我就不必在 compLibB 构建阶段重新指定它?

在构建 libA.la 时,您不需要指定 LAPACK 库,因为最终链接尚未发生。如果不将 libA 设为共享库,我就无法实现您想要的。

【讨论】:

    【解决方案2】:

    这实际上应该可以工作,因为_LIBADD 旨在使依赖项具有传递性和工作性。另一方面,使用 $(top_builddir) 时可能会遇到不同的问题,因为 libtool 会处理以相对路径和绝对路径链接的不同库。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多