如需转载,请注明出处!
最近看了下,网上关于automake使用鱼龙混杂,很多只是给出简单的单一文件编译(以一个main.c为例)。在实际的工程应用中,我们常将代码按照模块进行组织,所以本文将结合多目录automake组织,以一个小例子来进行总结。
文件组织目录:
examples
| -- src
| -- dlist_append.c
| -- dlist_append.h
| -- sample
| -- main.c
编译目标:
src目录下的代码编译生成动态库libdlist.so;sample目录下main.c依赖libdlist.so 生成可执行文件test。
流程开始:
1. 在根目录example下执行命令:autoscan. 在当前目录下会生成文件 autoscan.log 和 configure.scan.
2. 将configure.scan重命名为 configure.in.
3. 编辑configure.in文件如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69]) # autoconf版本号
AC_INIT(dlist, 1.0, deric) # 修改项:初始化信息,包含包名、版本号、作者联系信息
AC_CONFIG_SRCDIR([sample/main.c]) # 修改项:侦测指定源文件是否存在,该项目任意文件即可
AC_CONFIG_HEADERS([config.h]) # 生成config.h文件,供autoheader使用
AM_INIT_AUTOMAKE(dlist, 1.0) # 添加项:初始化automake,包含包名、版本号
# Checks for programs.
AC_PROG_CC # 编译器
AC_PROG_CXX # 添加项:C++编译器
# Checks for libraries.
AC_PROG_RANLIB # 添加项:编译静态库使用
AC_PROG_LIBTOOL # 添加项:编译动态库使用
# Checks for header files.
AC_CHECK_HEADERS([stdlib.h]) # 检查系统头文件
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile src/Makefile sample/Makefile]) # 修改项:配置每一级模块目录下生成Makefile,很重要
AC_OUTPUT
4. 在根目录example下执行命令:aclocal. 在当前目录下会生成文件 aclocal.m4 和 autom4te.cache. 主要处理本地的宏定义。
5. 在根目录example下执行命令:autoconf. 在当前目录下会生成文件 configure.
6. 在根目录example下执行命令:autoheader. 在当前目录下会生成文件 config.h.in. 该工具负责从acconfig.h中复制用户附加的符号定义.
7. 在每个需要生成Makefile的目录中创建并编辑Makefile.am文件(examples examples/src examples/sample)
/* examples/Makefile */
AUTOMAKE_OPTIONS=foreign # AUTOMAKE_OPTIONS 是Automake 的选项。Automake 主要是帮助开发 GNU 软
# 件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中
# 应具备的文件,例如 'NEWS'、'AUTHOR'、 'ChangeLog' 等文件。设置为foreign 时,Automake
# 会改用一般软件的标准来检查。如果不加这句的话,需要在autoconf之前,先执行touch NEWS
# README AUTHORS ChangeLog 来生成'NEWS'、'AUTHOR'、 'ChangeLog' 等文件
SUBDIRS= src sample # 执行子目录Makefile,注意顺序
/* examples/src/Makefile.am */
#staic libraries# # 生成静态库的版本
#AUTOMAKE_OPTIONS=foreign
#lib_LIBRARIES=libdlist.a
#libdlist_a_SOURCES=dlist_append.c dlist_append.h
#include_HEADERS=dlist_append.h
#dynamic libraries# # 生成动态库的版本
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libdlist.la # 动态库名字以la结尾,最终生成的动态库会以so结尾
libdlist_la_SOURCES=dlist_append.c dlist_append.h # 列出参与编译动态库的全部源文件
include_HEADERS=dlist_append.h # 生成的include目录,供其他程序调用时需要依赖的头文件
/* examples/sample/Makefile */
#static dependency# # 依赖静态库的版本
#AUTOMAKE_OPTIONS=foreign
#bin_PROGRAMS=test
#test_SOURCES=main.c
#test_CPPFLAGS=-I/home/deric/development/examples/src
#test_LDADD=/home/deric/development/examples/src/libdlist.a
#dynamic dependency#
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=test
test_SOURCES=main.c
test_CPPFLAGS=-I/home/deric/development/examples/src
test_LDADD=-L/home/deric/development/examples/src -ldlist
8. 若src生成动态库,则在根目录example下执行命令:libtoolize --automake;若生成静态库则忽略此命令。libtoolize 提供了一种标准的方式来将libtool 支持加入一个软件包
9. 在根目录example下执行命令:automake --add-missing. 选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。
10. 在根目录example下执行命令: ./configure --prefix=$(pwd)/build, make, make install 则在build目录下生成lib include bin目录,并生成相应库文件、外部需依赖的头文 件、可执行文件