Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多。好在Linux为我们提供了自动生成功能完善的Makefile文件的工具autoconf/automake。本文讲述如何使用它们生成Makefile文件。
环境
- OS
ubuntu 16.04 - aclocal
1.15 - autoconf
2.69-9 - automake
1.15
使用示例
准备
创建一个main.c
文件
1 |
|
1 | ls |
创建configure.in文件
运行autoscan
,自动创建两个文件autoscan.log
和configure.scan
1 | autoscan |
修改configure.scan
,AC_INIT里面的参数: AC_INIT(main,1.0, test@263.com);添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号;在AC_OUTPUT后添加输出文件Makefile。
1 | # -*- Autoconf -*- |
将configure.scan
重命名成configure.ac
1 | ls |
生成aclocal相关文件
运行aclocal
,生成文件aclocal.m4
、目录autom4te.cache
,处理本地的宏定义。
1 | aclocal |
生成configure文件
运行autoconf
1 | autoconf |
生成config.h.in文件
运行autoheader
,生成config.h.in,该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。
1 | autoheader |
运行automake
运行automake之前先创建一个Makefile.am
,这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am
,用户需要自己创建相应的文件。之后,automake工具转换成Makefile.in
。
Makefile.am1
2
3
4AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main
main_SOURCES=main.c
- AUTOMAKE_OPTIONS为设置automake的选项
由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。 - bin_PROGRAMS定义要产生的执行文件名
如果要产生多个执行文件,每个文件名用空格隔开。 - main_SOURCES定义“main”这个执行程序所需要的原始文件
如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。
1 | automake --add-missing |
使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。
1 | ls |
运行configure生成Makefile
通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile
1 | ./configure |
make编译工程
1 | make |
1 | ls |