automake第三方图书馆

时间:2015-06-05 23:18:45

标签: c++ gnu autotools automake

如何使用automake编译和链接第三方库?

我的文件结构是:

program/
  |
  +--src/
  |   |
  |   +--Makefile.am
  |   +--main.cpp
  |
  +--lib/
  |   |
  |   +--Makefile.am
  |   +--library.cpp
  |
  +--Makefile.am
  +--configure.ac
  +--README

automake文件的内容非常通用:

# src/Makefile.am
bin_PROGRAMS = program
program_SOURCES = main.cpp
# Makefile.am
SUBDIRS = src lib
dist_doc_DATA = README
# configure.ac
AC_INIT([program], [1.0])
AM_INIT_AUTOMAKE([-Wall])
AC_PROG_CXX
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile lib/Makefile])
AC_OUTPUT

lib/Makefile.am的内容应该是什么?

1 个答案:

答案 0 :(得分:4)

(当你似乎自己控制了库代码时,不确定为什么你说“第三方”...有关使用Automake创建和使用库的更多相关信息,我引用你到{ {3}})

<强> LIB / Makefile.am

lib_LIBRARIES = libYOURLIB.a
libYOURLIB_a_SOURCES = library.cpp

如果您不想安装库本身,可以使用noinst_lib_LIBRARIES。请注意,我假设您只想构建一个静态库。请参阅GNU Automake手册的GNU Automake manual's section on libraries部分,以便与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 (取自GNU Automake邮件列表档案中的Building A Shared Library)中尝试以下操作:

FORCE:

$(top_builddir)/lib/libYOURLIB.a: FORCE
<TAB>(cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libYOURLIB.a)

您也可以简单地将lib作为您的评论所指示的src子目录,并使其更简单。

或者,您可以停止使用递归构建设置并使用可能更简单的非递归构建设置。有关这方面的一些信息,请参阅"Re: library dependency"GNU Automake Manual §7.3: An Alternative Approach to Subdirectories,但一般的想法是改变要允许的内容:

<强> configure.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.cppsrc/main.cpp#include "library.hpp",并且它位于另一个目录中,您可能还想对所有文件使用AM_CPPFLAGS = -I $(top_srcdir)/includeobj_program_CPPFLAGS = -I include对于构建bin/program时使用的所有源文件,假设library.hpp位于program/include。我不确定当另一个项目在您自己的$(top_srcdir)变量中包含您的整个program源目录时,SUBDIRS是否正确,但$(srcdir)将始终引用顶级在非递归automake的情况下,program目录,使其在包含此包作为组件的大型项目中可能更有用。