Makefile 文件的生成
在linux下开发大型程序时,make工具可以将大的工具分解成很多个小模块,理清各个源文件的复杂关系。然而,手工编写makefile是一项令人非常头疼的工作,耗时费力,容易出错。本文介绍如何使用自动化工具autoconf 和automake自动生成makefile文件,使得程序员开发的大型程序的编译变得十分简单,只需要“m”或者“make”命令即可。这种大型程序下载后的安装也很省力,只需要“./configure”, “make”,“make install”即可。
automake支持三种目录层次:flat、shallow和deep. flat指的是所有文件都在同一个目录中,shallow指的是主要源码在当前目录,其他部分源码在子目录,deep指的是当前目录只有配置信息,源码都分布在各个子目录中。本文先介绍最简单的情况——flat。
生成configure.in
- 创建一个工程目录automake_test,在工程目录下创建src目录,将所有源码(例如本例是heapsort.h, heapsort.cc, main.cc)放在src中。
- 在automaked_test目录下,执行以下命令:
autoscan
mv configure.scan configure.in
touch NEWS README ChangeLog AUTHORS Makefile.am
cd src
touch Makefile.am
cd ..
cp /usr/share/automake-1.X/depcomp .
cp /usr/share/automake-1.X/compile .
修改configure.in
原configure.in文件如下:
AC_PREREQ([2.68])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([src/main.cc])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
将其改成
AC_INIT(test, 1.0, [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([src/main.cc])
AM_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(test, 1.0)
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile
src/Makefile])
编辑Makefile.am文件
把automake_test下的Makefile.am内容置为
SUBDIRS = src
把src下的Makefile.am内容置为
bin_PROGRAMS = test
test_SOURCES = main.cc heapsort.h heapsort.cc
其中test是即将生成的可执行文件名。
生成makefile文件
在automake_test下运行以下命令:
aclocal
autoconf
autoheader
automake -a
./configure
运行示例程序
在src目录下,运行以下命令即可看到程序运行的结果。
make
./test
备注:在某些版本的自动化编译工具下,若有提示需要configure.ac作为automake的输入,则把configure.ac改名为configure.in,重复以上命令即可。