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.la
、misc.la
以构建 main
?
换句话说,我想包含所有由*** make 构建的 *.la 文件。
这当然只是一个例子,在真实场景中,我在一个类似于上面的目录中处理了 20 多个这样的库。
【问题讨论】:
【参考方案1】:递归make case
您听起来好像在使用递归 make,其中一个*** Makefile.am
、一个 main/Makefile.am
和一个用于 misc
、dict
中的 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 包含所有库的主要内容,如果未能解决你的问题,请参考以下文章