如何编译和链接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
?
(不知道为什么你说的“第三方”当你出现有库代码自己......欲了解更多信息有关创建和使用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.cpp
和src/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的,使得它或许更在包括这个包作为成分较大的项目是有用的。