首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Automake包含所有库

Automake包含所有库
EN

Stack Overflow用户
提问于 2020-02-08 07:02:24
回答 1查看 64关注 0票数 0

我的目录结构如下所示:

代码语言:javascript
复制
-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多个这样的库,每个库都位于类似于上面的目录中。

EN

回答 1

Stack Overflow用户

发布于 2020-02-20 02:32:01

递归make case

您听起来就像是在使用递归make,在miscdict和其他20个类似的库中为FOO使用一个顶级Makefile.am、一个main/Makefile.am和一个FOO/Makefile.am

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

在递归生成情况下,您将需要调整main/Makefile.am以将main与所有这些库链接起来,并确保在必要时实际(重新)构建这些库:

代码语言:javascript
复制
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)中。然后,向主程序添加库可以简化为添加一行

代码语言:javascript
复制
mainprog_LDADD += libmisc.la

不需要任何额外的规则。这还可以并行化那些20+库的构建,这是一个非常受欢迎的副作用。

新的顶级Makefile.am将为每个库包含一行,如下所示

代码语言:javascript
复制
include misc/Makefile-files

以一行结束

代码语言:javascript
复制
include main/Makefile-files

而文件misc/Makefile-files将包含如下内容

代码语言:javascript
复制
# -*- Makefile -*-
lib_LTLIBRARIES   += libmisc.la
libmisc_la_SOURCES = %reldir%/misc.c

main/Makefile-files看起来像

代码语言:javascript
复制
# -*- 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

代码语言:javascript
复制
bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =

其中的misc/Makefile-files包含

代码语言:javascript
复制
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

代码语言:javascript
复制
include main/Makefile-files

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

mainprog_LDADD += $(lib_LTLIBRARIES)

由于main/Makefile-files

代码语言:javascript
复制
bin_PROGRAMS     += mainprog
mainprog_SOURCES  = main.c
mainprog_LDADD    =

以及misc/Makefile-files和其他库:

代码语言:javascript
复制
lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = misc.c

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60122250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档