makefile制作

来源:互联网 发布:淘宝退货率高了怎么降 编辑:程序博客网 时间:2024/04/26 22:34
1. 引言
    无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。
    但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。幸而有GNU提供的Autoconf及Automake这两套工具使得编写Makefile不再是一个难题。
    本文将介绍如何利用 GNU Autoconf 及 Automake 这两套工具来协助我们自动产生 Makefile文件,并且让开发出来的软件可以像大多数源码包那样,只需“./configure”,“make”,“make install” 就可以把程序安装到系统中。

2. 操作过程
    首先进入目标project目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:
1) 运行autoscan命令;
2) 将configure.scan 文件重命名为configure.ac,并修改configure.ac文件;
3) 在project目录下新建Makefile.am文件,并在它的子目录下也新建makefile.am文件;
4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS四个文件;
5) 依次运行aclocal、autoconf和autoheader三个命令;
6) 编写Makefile.am文件;
7) 再运行automake -a命令(或automake --add-missing);
8) 最后运行./confiugre脚本,这一步即会生成Makefile文件。
    可以通过下图看出生成Makefile的全流程:


图 Figure 1 生成Makefile流程图

    从上图可以看出,生成Makefile的过程中,关键是要编写好configure.in和Makefile.am两个文件。下面以一个简单示例来演练生成Makefile文件的操作过程。

3. 简单示例
    下面以一个简单的示例来具体介绍Makefile是如何生成的。
    1) 编写源代码
    创建一个子目录hello,并在这个目录下新建一个hello.cpp源代码文件,hello.cpp的内容为:
#include <stdio.h>
int main()
{
printf("Hello, world/n");
Return 0;
}

    2) 在hello目录下运行autoscan命令
    执行完autoscan之后,会在当前目录下生成一个configure.scan文件,通常可以用它作为configure.ac文件的蓝本。
jayyi@tsf-dev:~/hello$ autoscan
jayyi@tsf-dev:~/hello$ ls
configure.scan hello.cpp

    3) 将configure.scan重命名为configure.ac,并修改其内容为(蓝色部分是新增或修改的):
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(hello, 1.0, [jayyi@tencent.com])
AC_CONFIG_SRCDIR([hello.cpp])
AC_CONFIG_HEADER([config.h])
AM_INIT_AUTOMAKE(hello, 1.0)

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_OUTPUT([Makefile])

    4) 执行touch NEWS README AUTHORS ChangeLog以生成四个空文件
jayyi@tsf-dev:~/hello$ touch NEWS README AUTHORS ChangeLog
    5) 依次执行aclocal、autoconf和autoheader三个命令,以生成必要的文件
jayyi@tsf-dev:~/hello$ aclocal;autoconf;autoheader
    这些必要的文件包括aclocal.m4,config.h.in,configure等。

    6) 在当前目录下编写Makefile.am文件,文件内容为:
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.cpp

    7) 再运行automake -a命令 jayyi@tsf-dev:~/hello$ automake -a
    在这一步之后,就可以通过执行当前目录下的configure脚本来生成Makefile文件了。

    8) 运行当前目录下的configure脚本生成Makefile文件
jayyi@tsf-dev:~/hello$ ./configure
    如果需要指定安装目录,则带参数方式运行configure,如:
jayyi@tsf-dev:~/hello$ ./configure --prefix=安装目录

    9) 现在在当前目录下已经生成了Makefile文件,下个“make”指令就可以将hello.cpp编译成可执行程序hello
jayyi@tsf-dev:~/hello$ make
make all-am
make[1]: Entering directory `/data/home/jayyi/hello'
if g++ -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -MT hello.o -MD -MP -MF ".deps/hello.Tpo" -c -o hello.o hello.cpp; /
then mv -f ".deps/hello.Tpo" ".deps/hello.Po"; else rm -f ".deps/hello.Tpo"; exit 1; fi
g++ -g -O2 -o hello hello.o
make[1]: Leaving directory `/data/home/jayyi/hello'

jayyi@tsf-dev:~/hello$ ./hello
Hello, world

    最后,你还可以试试“make install”,“make uninstall”,“make dist”等有什么效果。由于篇幅有限,这篇简介只介绍了automake的皮毛罢了,如果较系统的掌握automake的使用,请参见其它讲解比较全面深入的文档。

4. 附示例代码:
    Hello示例代码使用方法:
1) 在linux服务器上新建一个hello目录
2) 将hello.cpp,configure.ac和Makefile.am三个文件以ascii码方式上传到linux服务器的hello目录下
3) 登录到linux服务器,并进入hello目录
4) 使用touch创建NEW,README,AUTHORS,ChangeLog四个空文件:
touch NEW README AUTHORS ChangeLog
5) 依次执行如下命令:
aclocal,autoconf,autoheader,automake -a
经过第5步之后,会在hello目录下生成一个configure可执行shell脚本文件。
6) 在hello目录下运行configure,以生成Makefile文件,运行configure的格式为:
./configure --prefix=<安装目录>
7) 进行make,以生成hello可执行程序
执行完configure之后,会在hello目录下生成一个Makefile文件,这个时候就可以make了,在hello目录下执行make即可完成编译
8) 在hello目录下运行hello可执行程序
./hello
    即可看到屏幕输出:Hello, world

 
原创粉丝点击