Clang 自动生成包括所有库

Clang 自动生成包括所有库,clang,automake,Clang,Automake,我的目录结构如下所示: -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文件 当然,这只是一个例子,在实际场景中,我

我的目录结构如下所示:

-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多个这样的库。

递归生成案例 听起来就像是在使用递归make,其中一个顶级
Makefile.am
,一个
main/Makefile.am
和一个
FOO/Makefile.am
用于
misc
dict
,以及其他20个这样的库

如果可能的话,我会尝试在这个用例中使用非递归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
您需要重复该
\u LDADD+=
,并为这20多个库中的每一个构建规则模式

非递归make用例 就我个人而言,我会转而使用带有一个顶级
Makefile.am
的非递归make,同时将
mainprog
可执行文件和20+
libfoo.la
文件放入
$(top\u builddir)
。然后,将库添加到主程序可以简化为添加一行

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

新的顶级
Makefile.am
将为每个库包含一行

include misc/Makefile-files
以一行结尾

include main/Makefile-files
文件
misc/Makefile文件
将包含以下内容

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

# -*- 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”
,则每个库
mainprog\u CPPFLAGS+=-I$(top\u srcdir)/misc
添加项将需要20多个。如果您可以将其更改为
#include“misc/misc.h”
,则可以使用单个
mainprog\u CPPFLAGS=-I$(top\u srcdir)

您还可以将
main/Makefile文件
包含在所有这些库
Makefile文件
之前,并一致地将相应的库添加到库
Makefile文件
中的mainprog:

bin_PROGRAMS      += mainprog
mainprog_SOURCES   = main.c
mainprog_CPPFLAGS  =
mainprog_LDADD     =
包含以下内容的
misc/Makefile文件

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = %reldir%/misc.c
mainprog_CPPFLAGS  += -I$(top_srcdir)/%reldir%
mainprog_LDADD     += libmisc.la
如果您可以保证从顶级
Makefile.am
构建的所有库都链接到主程序,并且主程序源可以使用
#包括“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文件

bin_PROGRAMS     += mainprog
mainprog_SOURCES  = main.c
mainprog_LDADD    =
misc/Makefile文件
以及其他库:

lib_LTLIBRARIES    += libmisc.la
libmisc_la_SOURCES  = misc.c

有关使用非递归make作为灵感的单个库和主程序的完整工作示例,请参阅我的答案和。

非常感谢您提供的全面答案!