Makefile好难写曾经也总结了一篇关于Makefile的文章《make和makefile的简单学习》。但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦。而更痛苦的是当需要将代码移植到别的系统上时,这就够你喝一壶的。再说了,作为程序员的我们,是不是更应该投入更多的精力到业务逻辑的编写与处理中呢,而并不是和Makefile纠结呢。他们是怎么做到的?不知道你是否阅读过一些Linux平台上开源的C或者C++项目,当你编译这些项目的时候,只需./configure、make和make install就可以把程序编译完成并安装到系统中。你是否想过,这些开源的项目的编译和安装怎么如此的干净利落。我们觉的写Makefile很麻烦,我们羡慕那些开源项目简单的编译安装步骤。那么如何让写Makefile变得简单一些呢?这个时候大师们就编写了一些能够自动根据系统生成Makefile文件的工具。这篇文章,我就对这些工具进行简单的总结,并结合一个简单的例子进行实践。工具简介大师们写的工具主要有哪些呢?如下所示:GNU AutomakeGNU AutoconfGNU m4GNU Libtool如果你想使用这些工具,就先看看你的系统上有没有正确安装这些工具(我使用的是Ubuntu)。which autoconf如果没有安装,则执行以下语句安装就OK了。sudo apt-get install autoconfautoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。对于工具的简单介绍就到此结束,接下来讲讲如何使用这些工具来生成一个Makefile文件。自动生成makefile的步骤使用上述的工具生成Makefile文件的步骤基本是死的,只需要在每步按照我们的需求进行适当的配置即可生成一个“漂亮”的Makefile文件。具体的步骤如下:运行autoscan命令扫描源代码以搜寻普通的可移植性问题,比如检查编译器、库、头文件等,生成文件configure.scan,它是configure.ac的一个雏形。将configure.scan文件重命名为configure.ac,并按照需要修改configure.ac文件configure.ac文件的内容是一些宏,confiugre.ac调用一系列autoconf宏来测试程序需要的或用到的特性是否存在,以及这些特性的功能。这些宏经过autoconf处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.ac文件中的宏的顺序并没有规定,但是你必须在文件的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。在configure.ac中的一些常用宏定义。宏名称说明AC_PREREQ声明autoconf要求的版本号AC_INIT定义软件名称、版本号、联系方式AM_INIT_AUTOMAKE必须要的,参数为软件名称和版本号AC_CONFIG_SCRDIR用来侦测所指定的源码文件是否存在, 来确定源码目录的有效性AC_CONFIG_HEADER用于生成config.h文件,以便autoheader命令使用AC_PROG_CC指定编译器,默认GCCAC_CONFIG_FILES生成相应的Makefile文件,不同文件夹下的Makefile通过空格分隔。例如:AC_CONFIG_FILES([Makefile, src/Makefile])AC_OUTPUT用来设定configure所要产生的文件,如果是Makefile,configure会把它检查出来的结果带入Makefile.in文件产生合适的Makefile执行aclocal命令aclocal是一个perl 脚本程序。aclocal根据configure.ac文件的内容,自动生成aclocal.m4文件。执行autoheader命令该命令生成config.h.in文件。该命令通常会从acconfig.h文件中复制用户附加的符号定义。执行autoconf命令有了configure.ac和aclocal.m4 两个文件以后,我们就可以使用autoconf来产生configure文件了。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。在Project目录下新建Makefile.am文件运行automake命令automake会根据Makefile.am文件产生一些文件,其中最重要的是Makefile.in文件。执行configure生成Makefile。这些命令之间的关系如下图所示:以上就是生成一个完整makefile的主要步骤。当然了,在实际项目中,会根据需要进行微调。下面我就拿最经典的Hello World程序进行一个简单的演示。从Hello World开始测试代码:HelloWorld.cpp源码如下:#include
using namespace std;
int main()
{
cout<<"Hello World"<