(不知道为什么当你自己控制库代码时,你说的是“第三方”...有关使用Automake创建和使用库的更多信息,请参考GNU Automake manual's section on libraries)
的lib/Makefile.am
lib_LIBRARIES = libYOURLIB.a
libYOURLIB_a_SOURCES = library.cpp
您可以使用noinst_lib_LIBRARIES
,如果你不想安装库本身。请注意,我假设你只想建立一个静态库。请参阅GNU Automake手册的Building A Shared Library部分,以便与Libtool集成以生成共享库。当然,你可以手动完成,但Libtool更容易处理各种平台差异。
到库链接到program
,你会添加以下行
的src/Makefile.am:
program_DEPENDENCIES = $(top_builddir)/lib/libYOURLIB.a
program_LDADD = $(top_builddir)/lib/libYOURLIB.a
的_DEPENDENCIES
线只是告诉Automake是program
依靠lib/libYOURLIB.a
正在初建时,而_LDADD
行简单地将库添加到链接器命令。
上面假设您已经有了一个规则来构建库。由于您使用的是SUBDIRS
,您收到了“没有规则使目标XXXXXX”构建失败,这表明您没有(至少从子目录src
的Makefile的角度看)。为了解决这个问题,你可以试试下面的的src/Makefile.am(从"Re: library dependency"在GNU Automake的邮件列表存档占用):
FORCE:
$(top_builddir)/lib/libYOURLIB.a: FORCE
<TAB>(cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libYOURLIB.a)
你也可以简单地使lib
的src
子目录作为您的评论当然要指出并简化。
或者,您可以停止使用递归构建设置并使用可能更简单的非递归构建设置。有关这方面的一些信息,请参阅GNU Automake Manual §7.3: An Alternative Approach to Subdirectories和Non-recursive Automake,但总体思路是改变允许的内容:
配置。AC
AM_INIT_AUTOMAKE([-Wall subdir-objects])
...
AC_CONFIG_FILES([Makefile])
Makefile.am
# Instead of using the SUBDIRS variable.
include src/Makefile.am.inc
include lib/Makefile.am.inc
dist_doc_DATA = README
的lib/Makefile.am更名为的lib/Makefile.am.inc
# Full path relative to the top directory.
lib_LIBRARIES = lib/libYOURLIB.a
lib_libYOURLIB_a_SOURCES = lib/library.cpp
的src/Makefile文件.am更名为的src/Makefile.am.inc
# Full path relative to the top directory.
bin_PROGRAMS = bin/program
bin_program_SOURCES = src/main.cpp
bin_program_DEPENDENCIES = lib/libYOURLIB.a
bin_program_LDADD = lib/libYOURLIB.a
重命名文件是可选的(你总是可以只include src/Makefile.am
),但它有助于表示,这并不意味着是一个独立的Automake的源文件。
此外,假设lib/library.cpp
和src/main.cpp
都#include "library.hpp"
,它的其他目录下,你可能还需要使用对于在建bin/program
使用的所有源文件AM_CPPFLAGS = -I $(top_srcdir)/include
的所有文件或obj_program_CPPFLAGS = -I include
,假设library.hpp
是program/include
。我不知道是否$(top_srcdir)
是正确的,当另一个项目包含您的整个program
源目录在其自己的SUBDIRS
变量,但$(srcdir)
将永远指在非递归automake的情况下,顶级program
目录,使其可能更多在包含此软件包作为组件的大型项目中很有用。
只需添加到@ chrono的答案,'SUBDIRS'列出深度优先下降的目录。由于'src'依赖于'lib'版本,因此考虑设置:'SUBDIRS = lib src'。您甚至可以添加'.'目录来指示相对于当前目录的处理顺序。 –