热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

autotools工具使用

AutoTools傻瓜入门学习GNU/LINUX开发的编程人员,上手之后不久就会在编译开源软件的时候碰到configure脚本,过段时间还会知道conf

AutoTools 傻瓜入门

学习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 orinstall.sh in . ./.. ./../..
 和我们想的有点不同,我们还要用到automake命令做一些其它的事情,我们先执行一下:
 $automake
 configure.ac: required file `./install-sh' notfound
 configure.ac: required file `./missing' notfound
 automake: no `Makefile.am' found for anyconfigure output
 我们注意到最后一行,知道了还需要一个`Makefile.am`文件,这个文件我们要写一下,编辑一个文件,增加:
 bin_PROGRAMS = sqrt
 sqrt_SOURCES = sqrt.c
 sqrt_LDADD = $(LIBOJBS)
 执行automake试试?
 configure.ac: required file `./install-sh' notfound
configure.ac: required file `./missing' not found
automake: no `Makefile.am' found for any configure output
automake: Did you forget AC_CONFIG_FILES([Makefile]) inconfigure.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' notfound
 Makefile.am: required file `./README' notfound
 Makefile.am: required file `./AUTHORS' notfound
 Makefile.am: required file `./ChangeLog' notfound
 Makefile.am: installing `./COPYING'
 configure.ac:8: required file `config.h.in' notfound

 

前面缺的四个文件简单,我们按照自己的情况编辑保存即可,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 referenceto `sqrt'
 ...
 是因为我们没有把数学库加入链接,修改Makefile.am,将对应行修改为:
 sqrt_LDADD = $(LIBOBJS) -lm
 更新一下文件:
 $autoconf
 $automake
 $./configure
 $make
 $./sqrt




推荐阅读
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • PyFasterRCNN配置详解与优化指南
    本文主要讲解Faster-RCNN的配置过程,以及配置过程中遇到问题的解决方案。 1.下载工程gitclone--recursivehttps:github.comr ... [详细]
author-avatar
挤牙膏--
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有