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
分享到:
相关推荐
在`标题`和`描述`中提到的"makefile 制作放马"可能是指创建一个`Makefile`来管理名为`xfa_mibget.c`, `snmptrap.c`, `test.c`, `xfa_queue.c`等的源文件。 首先,我们来看`Makefile`的基本结构。它通常包含目标...
【标题】: "深入理解与实践Makefile制作过程" 在软件开发中,Makefile是一个至关重要的工具,它帮助我们自动化构建、编译和链接程序的过程。这篇详细的文章将带你走进Makefile的世界,揭示其制作过程及其核心原理。...
在软件开发中,`Makefile`是一个非常重要的工具,它帮助开发者自动化构建、编译和链接项目中的源代码,从而提高效率。本文将详细介绍如何生成一个`Makefile`,以及涉及到的相关知识点。 首先,我们需要了解生成`...
最近写编译器,生成makefile搞得我心情不好。 用cmake,要自己打那么多字,伐开心。 自己写makefile,更是在当年做shellbash的时候就经历过来,不好用。 所以就把autoconf那一系列整合了一下。 然后自己写了脚本...
在软件开发过程中,Makefile是不可或缺的一部分,它用于自动化构建、编译和链接项目中的源代码,使得开发者能够高效地管理复杂项目的构建流程。本文主要介绍如何通过一系列步骤生成一个符合特定平台的Makefile文件。...
STM32自写Makefile工程是一项重要的技能,尤其对于嵌入式系统开发者而言。Makefile是构建项目的自动化工具,能够简化编译、链接等过程,提高开发效率。在这个项目中,我们关注的是如何为STM32微控制器编写自定义的...
本文将详细解析Makefile的制作及其在软件开发中的应用。 首先,理解Makefile的基本结构至关重要。一个Makefile通常包含目标(targets)、依赖项(dependencies)和规则(rules)。目标通常是需要构建的文件,如可...
【Makefile的制作方法】 Makefile是软件构建过程中的一个重要工具,它定义了一系列的规则来自动化编译、链接等步骤,使得开发过程中可以更高效地管理项目。在编写Makefile时,我们需要理解其基本概念和语法,以实现...
最基本的makefile制作,包括对路径的设定以及多文件多目录的实例
《跟我学Makefile:全面解析与实践》 在软件开发中,Makefile是自动化构建过程的重要工具,它能帮助开发者有效地管理项目中的编译和链接过程。本文将深入探讨Makefile的核心概念、结构以及如何编写和使用Makefile,...
### Makefile 学习指南 #### 一、Makefile 的重要性和作用 Makefile 是一种用于定义项目构建过程和依赖关系的脚本文件。通过 Makefile 文件,开发者能够定义一系列规则来指示 make 工具如何编译源代码、处理文件...
### Makefile文件制作 在软件开发过程中,编译工作占据着相当重要的位置。随着项目规模的不断增大,手工编译不仅耗时而且容易出错。为了解决这一问题,Makefile作为一种自动化构建工具应运而生。本篇将详细介绍如何...
以下是使用Autotools制作makefile的详细步骤和概念: 1. **确认安装了必要的Autotools组件**:首先,需要确认系统中已安装了aclocal、autoscan、autoconf、autoheader、automake和configure等工具。可以使用which...
### 轻松制作Makefile:深入理解与实践 #### 一、Makefile简介与重要性 Makefile是计算机编程领域中的一个重要概念,主要用于自动化构建软件项目。它是一系列规则和命令的集合,用于告诉系统如何编译源代码并链接...
`automake` 是一个广泛使用的开源工具,主要用于创建遵循 GNU 编译标准的 Makefile 文件。这个模板提供了使用 `automake` 创建自定义 Makefile 的基础结构,使开发者能够快速适应并应用于自己的项目。 `automake` ...
目标是你想要制作或更新的文件,依赖项是目标生成所需的前提条件,命令则是完成这些转换的步骤。例如: ``` target : dependencies command another_command ``` 每个命令行前要加一个tab键,这是Makefile识别...
Makefile是Unix/Linux环境下的一种构建工具,用于自动化编译、链接和其他相关任务,极大地提高了开发者的工作效率。在软件开发过程中,Makefile定义了一系列规则来指定如何将源代码转换为可执行程序或库。Bash是一种...
总的来说,这个为Graphviz定制的Makefile极大地提高了流程图制作的效率,使得用户可以专注于图形的设计,而非繁杂的转换过程。通过灵活地配置和扩展Makefile,你可以根据自己的需求调整图的生成方式,实现高效且有序...
### Makefile 编写入门与实践 #### 一、Makefile 概述 Makefile 是一种用于自动化构建软件项目的脚本文件,它基于特定的规则和语法,与 `make` 工具配合使用,帮助开发者简化编译过程,提高开发效率。在软件开发...
- `-k`或`--keep-going`即使有目标无法制作,也继续尝试其他目标。 - `-n`或`--just-print`仅打印命令而不执行,用于预览构建过程。 - `-q`或`--question`检查目标是否是最新的,如果需要更新则不显示任何输出。 ...