.# Ubuntu16.04下使用autotools生成Makefile##
最近在网上买了一本旧书,书名《嵌入式Linux应用程序开发详解》,因为出版的时间是2006年,到现在已经过去十多年,书里的内容有些已经过时,而且书上的环境为Redhat,和我目前使用的系统环境不同(Ubuntu 16.04),因此按照书上第三章实验部分使用autotools生成Makefile过程中遇到了问题,没有生成相应的Makefile。后来参考网上的一些博客,把这个问题解决了,下面就简单叙述一下解决过程,简单分析一下出问题的原因。
使用工具:
autoscan
aclocal
autoconf
autoheader
automake
以上的工具就是生成Makefile要用到的autotools。
hello.c
#include "hello.c"
int main()
{
printf("Hello orld!\n");
return 0;
}
hello.h
#include <stdio.h>
将hello.c和hello.h放在同一目录下:
下面就介绍生成Makefile的过程,以及注意点。
1、使用autoscan生成configure.scan
直接在目录下运行autoscan:
可以看到,运行autoscan后生成了log文件autoscan.log和我们要用到的configure.scan文件。
2、用configure.scan生成configure.ac文件
3、修改configure.ac文件
将configure.ac修改成如下内容:
截图:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT(hello, 1.0, lijintang1208@vip.qq.com)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.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
以上文件添加了两行内容,分别为第6行:AM_INIT_AUTOMAKE,第21行AC_CONFIG_FILES([Makefile])。
这部分在《嵌入式Linux应用开发详解》上没有讲到,而且书上是将configure.scan文件修改为configure.in文件,如果按照书上的内容来做,后面是不能生成用于生成Makefile的Makefile.in文件的。
还要讲一下第5行AC_INIT行。这行的参数hello代表要生成的程序名,1.0为程序版本号,最后的邮箱一般为bug报告的邮箱,一般为作者邮箱也可不写。
4、运行aclocal
可以看到运行后在目录下生成了aclocal.m4文件和autom4te.cache目录。
5、编写Makefile.am文件
文件内容:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c hello.h
6、运行autoheader
运行成功后生成config.h.in文件
7、使用touch命令生成automake必须的文件
运行成功后生成NEWS、README、AUTHORS和ChangeLog文件。
8、运行automake
运行automake -a之后可以看到目录下生成了其他一些文件和目录,其中Makefile.in就是最终生成Makefile的必须文件,如果第三步中不添加两条内容,在这步就不能生成Makefile.in文件也就导致了最后不能生成Makefile文件。
9、运行autoconf
运行autoconf之后,目录下生成了可执行文件configure。
10、运行可执行文件configure
可以看到运行configure文件之后,目录下生成了我们想要的Makefile文件。
下面就验证我们生成的Makefile是否正确。
11、编译代码并运行程序
通过make工具编译代码后查看目录下已经生成了hello程序,运行后正常打印hello world!说明使用以上步骤生成的Makefile可以运行。
通过autotools生成的Makefile内容也比自己编写的全面很多,里面有很多的预定义变量,这些变量的含义通常是固定的。
参考文献:
[1]:
http://blog.csdn.net/zhengqijun_/article/details/69952410
[2]: 《嵌入式Linux应用程序开发详解》 孙琼 编著.