Automake 包含所有库

Posted

技术标签:

【中文标题】Automake 包含所有库【英文标题】:Automake include all libraries 【发布时间】:2020-02-07 23:02:24 【问题描述】:

我的目录结构如下所示:

-misc
-- misc.h
-- misc.c
-- misc.la

-dict
-- dict.h
-- dict.c
-- dict.la

-main
-- main.c

我正在尝试将main.c 构建到一个程序中。 main.c 包含对 dict.c 中函数的引用,dict.c 包含对 misc.c 的引用

如何告诉 automake 包含 dict.lamisc.la 以构建 main ? 换句话说,我想包含所有由*** make 构建的 *.la 文件。

这当然只是一个例子,在真实场景中,我在一个类似于上面的目录中处理了 20 多个这样的库。

【问题讨论】:

【参考方案1】:

递归make case

您听起来好像在使用递归 make,其中一个*** Makefile.am、一个 main/Makefile.am 和一个用于 miscdict 中的 FOO 的 FOO/Makefile.am 以及其他 20 个此类库。

如果可能,我会尝试更改为对这个用例使用非递归 make(见下文)。

在该递归 make 案例中,您需要调整 main/Makefile.am 以将 main 与所有这些库链接,并确保在必要时实际(重新)构建这些库:

bin_PROGRAMS     = mainprog
mainprog_SOURCES = main.c
mainprog_LDADD   =

mainprog_LDADD += $(top_builddir)/misc/libmisc.la
$(top_builddir)/misc/libmisc.la:
        cd $(top_builddir)/misc && $(MAKE) libmisc.la

您需要重复 _LDADD += 并为这 20 多个库中的每一个构建规则模式。

非递归make case

就个人而言,我会切换到使用具有一个***Makefile.am 的非递归make,同时将mainprog 可执行文件和20 多个libfoo.la 文件放入$(top_builddir)。那么在主程序中添加一个库可以简化为添加一行

mainprog_LDADD += libmisc.la

不需要任何额外的规则。这也使这 20 多个库的构建并行化,这是一个非常受欢迎的副作用。

新的***Makefile.am 将包含每个库一行

include misc/Makefile-files

以一行结尾

include main/Makefile-files

文件misc/Makefile-files 将包含类似

# -*- Makefile -*-
lib_LTLIBRARIES   += libmisc.la
libmisc_la_SOURCES = %reldir%/misc.c

虽然main/Makefile-files 看起来像

# -*- Makefile -*-
bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =

# repeat for 20+ libraries
mainprog_LDADD += dict/libdict.la
mainprog_LDADD += misc/libmisc.la

如果您的主程序使用 #include "misc.h",则每个库需要 20+ 个 mainprog_CPPFLAGS += -I$(top_srcdir)/misc 添加。如果您可以将其更改为 #include "misc/misc.h",则可以使用单个 mainprog_CPPFLAGS = -I$(top_srcdir)

您还可以在所有这些库Makefile-files 之前包含main/Makefile-files,并始终将相应的库添加到库Makefile-files 中的mainprog:

bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =

misc/Makefile-files 包含

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = %reldir%/misc.c
mainprog_CPPFLAGS  += -I$(top_srcdir)/%reldir%
mainprog_LDADD     += libmisc.la

如果你能保证从顶层Makefile.am构建的所有lib_LTLIBRARIES都链接到主程序,并且主程序源可以使用#include "misc/misc.h",那么下面的顶层Makefile.am就可以了:

include main/Makefile-files

# 20+ library includes
include dict/Makefile-files
include misc/Makefile-files

mainprog_LDADD += $(lib_LTLIBRARIES)

main/Makefile-files 存在

bin_PROGRAMS     += mainprog
mainprog_SOURCES  = main.c
mainprog_LDADD    =

misc/Makefile-files 和其他库:

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = misc.c

有关使用非递归 make 获得灵感的单个库和主程序的完整工作示例,请参阅我的回答 https://***.com/a/60306382/182675 和 github example I built for that。

【讨论】:

非常感谢您的全面回答!

以上是关于Automake 包含所有库的主要内容,如果未能解决你的问题,请参考以下文章

包括使用 automake 和 autoconf 的动态库

autoconf/automake:基于库存在的条件编译?

我真的需要为与 automake 链接指定库位置吗?

生成一个 Makefile,使用 Automake 一步编译和链接所有源文件

Automake 无法识别 Objective-C/C++

Automake:使用 make dist 删除配置脚本检查