automake的第三方库(automake third party libraries)

2019-10-23 07:29发布

如何编译和链接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

Answer 1:

(不知道为什么你说的“第三方”当你出现有库代码自己......欲了解更多信息有关创建和使用Automake的图书馆合作的控制,我是指你的GNU Automake的手册中有关库部分 )

LIB / Makefile.am

lib_LIBRARIES = libYOURLIB.a
libYOURLIB_a_SOURCES = library.cpp

您可以使用noinst_lib_LIBRARIES如果你不想安装库本身。 请注意,我假设你只希望建立一个静态库。 参见生成共享库的GNU Automake的手册的部分,用于与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”构建失败,这表明你(从Makefile文件中的观点,至少不src子目录)。 为了解决这个问题,你可以尝试在SRC以下/ Makefile.am(摘自“回复:库的依赖关系”的GNU Automake的邮件列表):

FORCE:

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

您也可以简单地lib的子目录src为您的评论指出,当然,并使其更简单。

或者,您可以停止使用递归构建设置,并使用了也许是一个简单的非递归构建设置。 见GNU的Automake手册第7.3节:另类视角的子目录和非递归Automake的关于一些信息,但总的想法是改变的事情,允许:

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)/include的所有文件或obj_program_CPPFLAGS = -I include对于在构建中使用的所有的源文件bin/program ,假定library.hpp是在program/include 。 我不知道如果$(top_srcdir)是正确的,当另一个项目包括整个program在自己的源代码目录SUBDIRS变量,但$(srcdir)总是引用顶级program目录中的非递归的情况下, automake的,使得它或许更在包括这个包作为成分较大的项目是有用的。



文章来源: automake third party libraries