本文将通过一个例子介绍如何使用autotools制作Makefile,最终运行可执行文件。
本例子中使用的源代码a.c如下。
#include "stdio.h"
void main()
{
int a,b;
int c;
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
c=a+b;
printf("a=%d,b=%d,a+b=%d\n",a,b,c);
}
在使用之前先确保系统已经安装了autoconf等工具。
一开始文件夹下只有源文件a.c,首先使用下面的命令。
autoscan
autoscan命令会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查,它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.ac”原型。
使用该命令后在生成了文件autoscan.log和configure.scan,如下图所示。
configure.scan文件的内容如下图所示。
其中,以“#”号开始的行为注释。
AC_PREREQ 宏声明本文件要求的autoconf版本,如本例使用的版本2.69。
AC_INIT宏用来定义软件的名称和版本等信息,BUG-REPORT-ADDRESS一般为作者的E-mail。
AC_CONFIG_SRCDIR宏用来侦测所指定的源文件是否存在,来确定源目录的有效性,此处为当前目录下的a.c。
AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。
接下来使用下面的命令将configure.scan文件更名为configure.ac。
mv configure.scan configure.ac
然后打开configure.ac文件并添加如下内容。
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
#AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_INIT(a,1.0)
AM_INIT_AUTOMAKE(a,1.0)
AC_CONFIG_SRCDIR([a.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
# AC_OUTPUT(Makefile)
相比于之前的configure.scan,configure.ac所做改变的地方如下图所示。
AM_INIT_AUTOMAKE是需要自己另加的,它是automake所必备的宏,也同前面一样,PACKAGE-NAME是所要产生软件套件的名称,VERSION是版本编号。
AC_CONFIG_FILES宏用于生成相应的Makefile文件。
也可以不加AC_CONFIG_FILES这一行,直接用AC_OUTPUT(Makefile)代替。
依次使用下面的命令生成相应的文件。
aclocal
autoconf
autoheader
使用aclocal命令会生成aclocal.m4文件和autom4te.cache文件。
使用autoconf命令生成configure文件。
使用autoheader命令生成config.h.in文件,该工具通常会从“acconfig.h”文件中复制用户附加的符号定义。
接下来在该目录下新建一个Makefile.am文件,并在其中键入下面的代码。
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = a
a_SOURCES = a.c
AUTOMAKE_OPTIONS为设置automake的选项,由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。本例使用foreign等级,它只检测必须的文件。
bin_PROGRAMS定义要生成的可执行程序的文件名,如果要产生多个执行文件,每个文件名用空格隔开。
a_SOURCES定义“a”这个执行程序所需要的原始文件,如果“a”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。要注意的是,如果要定义生成多个可执行文件,则对每个执行程序都要定义相应的file_SOURCES。
接下来使用automake命令。
automake --add-missing
这里使用选项“–adding-missing”可以让automake自动添加有一些必需的脚本文件,生成了Makefile.in文件,如下图所示。
然后运行可执行程序,把Makefile.in变成最终的Makefile。
./configure
可以看到,运行上面的命令之后Makefile文件就生成了。
然后使用make命令,就生成了下面的a可执行文件,然后运行该文件。
make 默认是make all
make install 把该程序安装到系统目录中去,此时直接运行可执行文件,也能出现正确的结果
make clean 清除之前编译产生的可执行文件以及目标文件
make dist 将程序和相关的文档打包为一个压缩文档
使用autotools制作Makefile文件尤其适合包含许多文件的项目,我们只需要在Makefile.am文件中输入目标文件、依赖文件、文件目录等就可以轻松地生成Makefile了。
使用autotools制作Makefile文件的指令汇总:
autoscan
mv configure.scan configure.ac
修改configure.ac中的内容
aclocal
autoconf
autoheader
新建Makefile.am文件键入代码
automake --add-missing
./configure
make
./a
Makefile也可以用makefile代替,但是前后要保持名称一致
以上就是使用autotools制作Makefile文件的所有内容了,希望对你有用!