学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道configure脚本是 autoconf生成的;但是真正想用起来autoconf,却是要弄明白config.h,configure.in,Makfile.am等一大堆的 文件,这可能要花些功夫。让我们从一个例子开始,争取为大家省点力气。

我们用个小程序作例子,计算一个整数的开方,建个工作目录:sqrt。程序很简单:
 #include
 #include
 int main()
 {
  int i=0;
  scanf("%d",&i);
  printf("sqrt(%d)=%f\n",i,sqrt(i));
 }
 接下来我们要编译这个程序:
 $cc -X -lm -o sqrt sqrt.c
 因为我们使用了数学库,所以要给链接器传递一个参数-lm。
 程序就完成了。
 我们想专业一点,给这个程序增加Make文件,不用再输入那么长的命令,同时还想让这个程序成为可移植的程序。这个时候,我们就需要用到autotools了。
 autotools包含了几个部分,最常用到的是autoconf和automake。
 我们先加入autoconf。
 autoconf需要一个configure.ac文件,幸运的是,我们不需要自己写这个文件,我们可以使用autoscan来生成这个文件。执行autoscan。
 $autoscan
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1
错误信息先不用管,目录下多了几个文件: autoscan.log configure.scan。我们要关心的是configure.scan,这是一个原始版本的configure.ac。打开这个文件,把下面这一行修改一下:
 AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
 改成
 AC_INIT([sqrt], [0.1.0], [you@mail.address])
参数的意思一目了然,不罗嗦了。接下来将文件另存为:configure.ac。执行:
 $autoconf
 我们看到,目录下又多了一些内容,我们关心的是configure这个脚本文件,执行一下试试吧!
 不过现在这个configure还没什么用,要发挥configure的真正目的——识别编译环境,配置编译选项的话,还要进行一些操作。

首先编辑configure.ac文件,在我们之前改动的AC_INIT...一行下面,加入如下一行内容:
AM_INIT_AUTOMAKE 
再执行一次autoconf试试?很不幸,我们遇到了错误:
configure.ac:6: error: possibly undefined macro: AM_INIT_AUTOMAKE...
因为找不到AM_INIT_AUTOMAKE宏,不要担心,因为我们少做了一步,先要把这些宏生成一下,当然是自动的。
$aclocal
$autoconf
现在的autoconf没有报错。这个时候再看看目录下面,发现多了一个aclocal.m4文件,这就是aclocal声称的宏命令文件,autoconf会使用它来生成新的configure脚本。
 是不是现在就能够自动搞定Makefile了?我们现在再执行一下configure,看看输出:
 configure: error: cannot find install-sh or install.sh in . ./.. ./../..
 和我们想的有点不同,我们还要用到automake命令做一些其它的事情,我们先执行一下:
 $automake
 configure.ac: required file `./install-sh' not found
 configure.ac: required file `./missing' not found
 automake: no `Makefile.am' found for any configure output
 我们注意到最后一行,知道了还需要一个`Makefile.am`文件,这个文件我们要写一下,编辑一个文件,增加:
 bin_PROGRAMS = sqrt
 sqrt_SOURCES = sqrt.c
 sqrt_LDADD = $(LIBOJBS)
 执行automake试试?
 configure.ac: required file `./install-sh' not found
configure.ac: required file `./missing' not found
automake: no `Makefile.am' found for any configure output
automake: Did you forget AC_CONFIG_FILES([Makefile]) in configure.ac?
 哦,不行,还要install-sh,missing文件,错误信息中,还提到AC_CONFIG_FILES([Makefile]),是的,我们还要修改一下configure.ac,在最后一行AC_OUTPUT前面增加一行:
 AC_CONFIG_FILES([Makefile])
 现在再执行一次automake吧,但是我们要加一个参数:
 $automake --add-missing
 configure.ac: installing `./install-sh'
 configure.ac: installing `./missing'
 Makefile.am: installing `./INSTALL'
 Makefile.am: required file `./NEWS' not found
 Makefile.am: required file `./README' not found
 Makefile.am: required file `./AUTHORS' not found
 Makefile.am: required file `./ChangeLog' not found
 Makefile.am: installing `./COPYING'
 configure.ac:8: required file `config.h.in' not found

前面缺的四个文件简单,我们按照自己的情况编辑保存即可,config.h.in从哪里来呢? 现在让我们把config.h.in搞出来,这个要用到autoheader,我们执行命令:
 $autoheader
 config.h.in文件就生成好了。准备好了其它几个文本文件,我们再执行一次,这次不用加参数了,不过我们还要再执行一次autoconf,因为我们修改了configure.ac之后还没有执行过autoconf。
 $autoconf
 $automake
 我们再执行一次./configure:
 $./configure
 ...
 config.status: creating Makefile
 config.status: creating config.h
 ...
 让我们执行一下make吧。
 $make
 ...
 /home/nevernew/sqrt/sqrt.c:7: undefined reference to `sqrt'
 ...
 是因为我们没有把数学库加入链接,修改Makefile.am,将对应行修改为:
 sqrt_LDADD = $(LIBOBJS) -lm
 更新一下文件:
 $autoconf
 $automake
 $./configure
 $make
 $./sqrt

http://blog.chinaunix.net/uid-26133817-id-4281323.html

autotools工具使用 good的更多相关文章

  1. automake - 使用 autotools 工具集

    一般而言,对于小项目或玩具程序,手动编写 Makefile 即可.但对于大型项目,手动编写维护 Makefile 成为一件费时费力的无聊工作. 本文介绍 autotools 工具集自动生成符合 Lin ...

  2. (6)autotools工具的使用

       autotools是专门用来生成Makefile的一系列工具,包括autoscan.aclocal.autoheader.autoconf.automake等.     (1)autotools ...

  3. 使用autotools工具用configure、make、make install编译安装linux工程的详细步骤

    使用autotools工具用configure.make.make install编译安装linux工程的详细步骤 转载tmxkwzy 最后发布于2016-11-24 10:20:15 阅读数 324 ...

  4. autotools工具使用记录

    参考 http://blog.chinaunix.net/uid-25100840-id-271131.html http://blog.sina.com.cn/s/blog_4c2bf01a0101 ...

  5. 利用autotools工具制作从源代码安装的软件 分类: linux 2014-06-02 23:27 340人阅读 评论(0) 收藏

    编写程序(helloworld.c)并将其放到一个单独目录. helloworld.c: #include<stdio.h> int main() { printf("hello ...

  6. 在 Linux 中使用 Eclipse 和 Gnu Autotools 管理 C/C++ 项目

    在我该系列的之前的所有随笔中,都是采用 Linux 发行版自带的包管理工具(如 apt-get.yum 等)进行软件的安装和卸载,从来没有向大家展示使用源代码自行编译安装软件的方法.但是长期混迹于 U ...

  7. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  8. GNU Autotools的研究(转)

    最近对Linux下软件项目的构建过程研究了一番.Linux下的软件项目通常用Autotools工具集和make工具来构建,我们通常使用./configure.make.make install这样的命 ...

  9. 如何使用autotools生成Makefile

    安装autotools工具sudo apt-get install autoconf 一,四个代码文件init.s lcd.c addr.h uart.c 二,命令:autoscan 三,命令:vi ...

随机推荐

  1. javascript 验证附件大小

    ///验证单个文件不能超过30M function onChangeFile() { ///定义布尔类型的返回结果,初始值为false(默认不超过30M) var sResult = false; / ...

  2. WPF 使用鼠标拖动一个控件的实现[2018.7.15]

    原文:WPF 使用鼠标拖动一个控件的实现[2018.7.15] Q:已经把一个Shape和一个TextBlock组合起来放到了一个Grid中,现在想要实现用鼠标拖动这个Grid到任意位置的功能,如何做 ...

  3. JAVA SE回顾及思考(1)——面向对象的特点

    学习Java已经三年了,现在开始做Android开发,虽说还在用Java语言但本人现在才真真的意识到无论学什么基础才是最重要的,可能一些刚接触Java或者Android的朋友现在还体会不到基础的重要性 ...

  4. Java 联系Oracle 数据库

    一般完成 import oracle.jdbc.driver.*; 会后声明,你会发现一个错误.然后,你需要: 一.该JDBC开车到classpath 两种方法.一是图形化,计算机-属性-高级设置-环 ...

  5. 关于J2SE/Jsp/Sping/Hibernate/Struts2的视频下载

    我是一名程序猿,从大学就開始学计算机.后来參加了编程工作.如今我认为若要做一名程序猿须要具备三个条件,这三个条件也是衡量一个人能否够成为程序猿的条件. 1.对计算机拥有浓厚的兴趣. 2.良好的逻辑思维 ...

  6. Git命令小总结

    常用 git init git 初始化 git clone https://github.com/wsxx111/thisStudy.git 从远端拉下来 git status 查看跟踪状态 git ...

  7. UWP 中的各种文件路径(用户、缓存、漫游、安装……)

    原文 UWP 中的各种文件路径(用户.缓存.漫游.安装……) UWP 提供了多种不同文件路径访问方式,对应到不同的文件路径中.可能我们只是简单用 ApplicationData.Current 获取一 ...

  8. C#获取windows 10的下载文件夹路径

    Windows没有为“下载”文件夹定义CSIDL,并且通过Environment.SpecialFolder枚举无法使用它. 但是,新的Vista 知名文件夹 API确实使用ID定义它FOLDERID ...

  9. 随机森林算法原理及OpenCV应用

    随机森林算法是机器学习.计算机视觉等领域内应用较为广泛的一个算法.它不仅可以用来做分类(包括二分类和多分类),也可用来做回归预测,也可以作为一种数据降维的手段. 在随机森林中,将生成很多的决策树,并不 ...

  10. 从源码角度看MySQL memcached plugin——1. 系统结构和引擎初始化

    本章尝试回答两个问题: 一.memcached plugin与MySQL的关系: 二.MySQL系统如何启动memcached plugin. 1. memcached plugin与MySQL的关系 ...