使用环境:Vmware下虚拟机CentOS 6.5
参考华清远见教程中的说明并且亲自手动尝试下,遇到了不少问题。运行一个简单的hello world程序,下面是一步步尝试步骤:
1. 确认系统是否安装一下工具(使用which命令查看)
autoscan
aclocal
autoconf
autoheader
automake
使用autotools主要是利用各个工具的脚本文件以生成最后的Makefile。流程图如下:
2. 使用autoscan,它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它将会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,该文件就是接下来autoconf要用到的“configure.in”原型。
3. 改写configure.scan文件,改好后并将其重新命名为configure.in,改好后如下图所示:
该图片中修改了AC_INIT()为AC_INIT(hello,1.0)
添加了AM_INIT_AUTOMAKE(hello,1.0)和AC_CONFIG_FILES([Makefile])
AC_PREREQ宏声明本文件要求的autoconf版本,教程中使用的版本2.59,而我的Linux下为2.63。
4. 使用aclocal,生成aclocal.m4文件,该文件主要处理本地的宏定义。
5. 使用autoconf,生成configure可执行文件。
6. 使用autoheader,生成config.h.in文件
7. 编写Makefile.am文件,用户需要自己创建相应的文件,之后使用automake工具转换成Makefile.in。
例Makefile.am如下:
其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种等级:foreign,gnu,gnits,让用户选择采用,默认等级为gnu,foreign等级它只检测必须的文件
bin_PROGRAMS定义要产生的执行文件名,如果要产生多个执行文件,每个文件名用空格隔开
bin_SOURCES定义hello这个执行程序所需要的原始程序,如果hello这个程序是由多个文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开,例如:hello需要hello.c,sunq.c,hello.h三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。需要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES
8. 使用automake生成“configure.in”文件,这里使用选项“--adding-missing”,可以让automake自动添加一些必须的脚本文件。
[Niklaus@localhost hello]$ automake --add-missing
结果出现如下错误:
configure.ac:6: installing `./install-sh'; error while making link: 不允许的操作
configure.ac:6: installing `./missing'; error while making link: 不允许的操作 src/Makefile.am: installing `./depcomp'; error while making link: 不允许的操作上网查询后发现,原来是因为把工程发在Linux和windows的共享目录下,也就是NTFS分区,把该目录移动到LInux下的ext3分区下就没问题了
参考:
9. 解决上面问题后重新运行以上步骤后,再运行configure。输入./configure。
就把Makefile.in文件变成了Makefile。
10. 运行make指令,或者运行make install
这样就编译成功生成hello执行文件
11. 输入./hello指令
其他的一些用法:
12. make clean
此时,make会清除之前所编译的可执行文件及目标文件(object file, *.o)
13. make dist
此时,make将程序和相关的文档打包为一个压缩文档以供发布,如下所示:
由上面的讲述不难看出,autotools确实是软件维护与发布的必备工具,也鉴于此,如今GUN的软件一般都是由automake来制作的。
参考来自: