我的目录结构如下所示:
-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多个这样的库,每个库都位于类似于上面的目录中。
发布于 2020-02-20 02:32:01
递归make case
您听起来就像是在使用递归make,在misc、dict和其他20个类似的库中为FOO使用一个顶级Makefile.am、一个main/Makefile.am和一个FOO/Makefile.am。
如果可能,我会尝试在这个用例中使用非递归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)。
您还可以将main/Makefile-files包含在所有这些库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://stackoverflow.com/a/60306382/182675和github example I built for that。
https://stackoverflow.com/questions/60122250
复制相似问题