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作为灵感的单个库和主程序的完整工作示例,请参阅我的答案和。非常感谢您提供的全面答案!