Ubuntu16.04下使用autotools生成Makefile

2019-07-13 04:37发布

.# 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! "); return 0; }

hello.h

#include 将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应用程序开发详解》 孙琼 编著.