网上已经有一些介绍使用automake生成静态链接库和动态链接库的方法。但随着autotools的升级,一些配置文件需要进行调整,现在就针对C++ cookbook的示例文件1-1~1-3的源文件介绍一下automake的实做方法。
假设我们的项目根目录为myhello,下面有三个子目录georgeringo,johnpaul,hellobeatles,其中georgeringo目录包含*.cpp和*.hpp,用来生成动态链接库。johnpaul目录下面有*.cpp和*.hpp,用来生成静态链接库,hellobeatles目录下面含有hellobeatles.cpp用来调用其他两个库。
实现的过程如下:
· 在johnpaul目录下新建Makefile.am,文件内容和生成静态库一样。
AUTOMAKE_OPTIONS=foreign
noinst_LIBRARIES=libjohnpaul.a
libjohnpaul_a_SOURCES=john.cpp paul.cpp johnpaul.cpp
include_HEADERS=john.hpp paul.hpp johnpaul.hpp
· 在georgeringo目录下新建Makefile.am文件,文件内容为:
ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libgeorgeringo.la
libgeorgeringo_la_SOURCES=george.cpp ringo.cpp georgeringo.cpp
include_HEADERS=george.hpp ringo.hpp georgeringo.hpp
· 在hellobeatles目录下新建Makefile.am文件,文件内容为:
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../georgeringo/ -I../johnpaul/
bin_PROGRAMS=hellobeatles
hellobeatles_SOURCES=hellobeatles.cpp
hellobeatles_LDADD=-L../georgeringo/ -lgeorgeringo ../johnpaul/libjohnpaul.a
· 在myhello3目录下运行autoscan命令,将configure.scan改为configure.ac文件,修改文件内容:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(hellobeatles,1.0)
AM_INIT_AUTOMAKE(hellobeatles,1.0)
AC_CONFIG_SRCDIR([config.h.in])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lgeorgeringo':
AC_CHECK_LIB([johnpaul], [main])
#AC_PROG_RANLIB
AC_PROG_LIBTOOL
LT_INIT
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_FILES([hellobeatles/Makefile
georgeringo/Makefile
johnpaul/Makefile])
AC_CONFIG_SUBDIRS([georgeringo] [johnpaul] [hellobeatles])
AC_OUTPUT([Makefile])
这里我同时加了AC_PROG_RANLIB和AC_PROG_LIBTOOL,其实只需要加入AC_PROG_LIBTOOL即可,加入的AC_PROG_RANLIB其实也会被AC_PROG_LIBTOOL覆盖。加入LT_INIT。
l 运行autoreconf –vfi
l 运行configure
l 运行make
这时候 johnpaul 和 georgeringo 目录下的库文件就生成了。 hellobeatles 下面就生成了可执行文件。