【问题标题】:Automake include all librariesAutomake 包含所有库
【发布时间】: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 多个这样的库。

【问题讨论】:

    标签: clang automake


    【解决方案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://stackoverflow.com/a/60306382/182675github example I built for that

    【讨论】:

    • 非常感谢您的全面回答!
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2017-01-18
    • 2011-01-17
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    相关资源
    最近更新 更多