使用automake将共享库链接到静态libtool库

时间:2014-06-05 16:00:15

标签: automake libtool

我有这个目录结构

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)

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

2 个答案:

答案 0 :(得分:1)

  

当我构建libA.la便利lib时,我是否已经在$(LAPACK)中链接了?

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

  

这是不洁净的,因为现在compLibB必须关注libA的细节。是否无法在libA构建阶段链接LAPACK库,以便我不必在compLibB构建阶段重新指定它?

在构建libA.la时,您不需要指定LAPACK库,因为最终链接尚未发生。我没有办法在没有libA共享库的情况下完成你想要的东西。

答案 1 :(得分:0)

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