automake,autoconf使用详解

作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了.

在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的 Makefile,这样就可以象常见的 GNU程序一样,只要使用”./configure”,”make”,”make instal”就可以把程序安装到Linux系统中去了.这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的Toy程序,那么这个文章对你也会有很大的帮助.

一.Makefile介绍

  Makefile是用于自动编译和链接的,一个工程有很多文件组成 ,每一个文件的改变都会导致工程的重新链接, 但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信息, 在 make时会决定在链接的时候需要重新编译哪些文件.
Makefile的宗旨就是 :让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。  
  Makefile的 基本结构不是 很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的 是 否符合惯例,而且自己写的 Makefile经常和自己的 开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改.这样就造成了手工书写Makefile的 诸多问题,automake恰好能很好地帮助我们解决这些问题.
  
  使用automake,程序开发人员只需要写一些简单的 含有预定义宏的 文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的 Makefile.下面我们将详细介绍Makefile的 automake生成方法。

二. 实例

  以HelloWorld为例

  > 新建三个文件

    helloworld.c  configure.in Makefile.am

  > 然后执行

    aclocal; autoconf; automake -add-missong; ./configure; make; ./helloworld

  可以看到makefile被产生出来,并且helloworld被编译出来。

  > helloworld.c

    1.   #include <stdio.h>
    2.   int main(int argc, char** argv){
    3.     printf("%s", ‘Hello, Linux World!\n");
    4.   return 0;
    5.   }

  >生成configure

    我们使用autoscan命令来帮助我们根据目录下的 源代码生成一个configure.in的 模板文件.
    命令:

    1.   $ autoscan

     $ ls

      configure.scan helloworld.c

    执行后在 hellowrold目录下会生成一个文件:configure.scan,我们可以拿它作为configure.in的 蓝本.
    现在 将configure.scan改名为configure.in,并且编辑它,按下面的 内容修改,去掉无关的 语句:

      ==========================configure.in内容开始=========================================

      # -*- Autoconf -*-

      # Process this file with autoconf to produce a configure script.

      AC_INIT(helloworld.c)

      AM_INIT_AUTOMAKE(helloworld, 1.0)

      # 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_OUTPUT(Makefile)

        ==========================configure.in内容结束=========================================

    然后执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件:

    1.   $ aclocal
    2.   $ls
    3.   aclocal.m4 configure.in helloworld.c
    4.   $ autoconf
    5.   $ ls
    6.   aclocal.m4 autom4te.cache configure configure.in helloworld.c

     可以看到configure.in内容是 一些宏定义,这些宏经autoconf处理后会变成检查系统特性.环境变量.软件必须的 参数的 shell脚本.

    autoconf 是 用来生成自动配置软件源代码脚本(configure)的 工具.configure脚本能独立于autoconf运行,且在 运行的 过程中,不需要用户的 干预.

    要生成configure文件,你必须告诉autoconf如何找到你所用的 宏.方式是 使用aclocal程序来生成你的 aclocal.m4.

    aclocal根据configure.in文件的 内容,自动生成aclocal.m4文件.aclocal是 一个perl 脚本程序,它的 定义是 :”aclocal – create aclocal.m4 by scanning configure.ac”.

    autoconf从configure.in这个列举编译软件时所需要各种参数的 模板文件中创建configure.

    autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本.

    m4是 一个宏处理器.将输入拷贝到输出,同时将宏展开.宏可以是 内嵌的 ,也可以是 用户定义的 .除了可以展开宏,m4还有一些内建的 函数,用来引用文件,执行命令,整数运算,文本操作,循环等.m4既可以作为编译器的 前端,也可以单独作为一个宏处理器.

  新建Makefile.am
  新建Makefile.am文件,命令:

  1. $ vi Makefile.am
  2.   内容如下:
  3. AUTOMAKE_OPTIONS=foreign
  4. bin_PROGRAMS=helloworld
  5. helloworld_SOURCES=helloworld.c

  automake会根据你写的 Makefile.am来自动生成Makefile.in.

  Makefile.am中定义的 宏和目标,会指导automake生成指定的 代码.例如,宏bin_PROGRAMS将导致编译和连接的 目标被生成.
  5.运行automake:

  1. $ automake --add-missing
  2. configure.in: installing `./install-sh‘
  3. configure.in: installing `./mkinstalldirs‘
  4. configure.in: installing `./missing‘
  5. Makefile.am: installing `./depcomp‘

  automake会根据Makefile.am文件产生一些文件,包含最重要的 Makefile.in.

  6.执行configure生成Makefile

  1. $./configure
  2. checking for a BSD-compatible install... /usr/bin/install -c
  3. checking whether build environment is sane... yes
  4. checking for gawk... gawk
  5. checking whether make sets $(MAKE)... yes
  6. checking for gcc... gcc
  7. checking for C compiler default output... a.out
  8. checking whether the C compiler works... yes
  9. checking whether we are cross compiling... no
  10. checking for suffix of executables...
  11. checking for suffix of object files... o
  12. checking whether we are using the GNU C compiler... yes
  13. checking whether gcc accepts -g... yes
  14. checking for gcc option to accept ANSI C... none needed
  15. checking for style of include used by make... GNU
  16. checking dependency style of gcc... gcc3
  17. configure: creating ./config.status
  18. config.status: creating Makefile
  19. config.status: executing depfiles commands
  20. $ ls -l Makefile
  21. -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile

你可以看到,此时Makefile已经产生出来了.

7.使用Makefile编译代码

  1. $make
  2. if gcc -DPACKAGE_NAME=\"FULL-PACKAGE-NAME\" -DPACKAGE_TARNAME=\"full-package-name\" -DPACKAGE_VERSION=\"VERSION\" -DPACKAGE_STRING=\"FULL-PACKAGE-NAME\ VERSION\" -DPACKAGE_BUGREPORT=\"BUG-REPORT-ADDRESS\" -DPACKAGE=\"helloworld\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STDLIB_H=1 -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" -c -o helloworld.o helloworld.c; \
  3. then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; else rm -f ".deps/helloworld.Tpo"; exit 1; fi
  4. gcc -g -O2 -o helloworld helloworld.o

  运行helloworld

  1. $ ./helloworld
  2. Hello, Linux World!

  这样helloworld就编译出来了,你如果按上面的 步骤来做的 话,应该也会很容易地编译出正确的 helloworld文件.你还可以试着使用一些其他的 make命令,如make clean,make install,make dist,看看它们会给你什么样的 效果.感觉如何?自己也能写出这么专业的 Makefile,老板一定会对你刮目相看.

时间: 2024-10-06 16:43:26

automake,autoconf使用详解的相关文章

CentOs之yum详解及程序的编译安装

CentOs之yum详解 yum的地位:yum是rpm的前端管理工具,而且依赖于rpm.  yum仓库:yum repository,仓库里存储了众多rpm包,以及包的相关的元数据文件.yum仓库里会有个repodata目录存在. yum支持的文件服务器类型: ftp://  http:// file:///(本地服务器,例光盘)   /nfs:// 查看yum的信息: [[email protected]]# rpm -q yum ------查看yum命令的安装包是哪个 yum-3.4.3-

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csdn.net/shulianghan VLC 二次开发 视频教程 : http://edu.csdn.net/course/detail/355 博客总结 : -- 本博客目的 : 让 Android 开发者通过看本博客能够掌握独立移植 VLC Media Player 核心框架到自己的 app 中,

CentOS程序包管理器rpm、yum以及程序包编译安装详解

一.程序包管理器RPM和Yum简介 程序包管理器:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,可以更方便地实现程序包的安装.升级.卸载和查询等管理操作. rpm软件包管理器(RPM Package Manager):rpm包存在依赖关系,依赖关系复杂,安装时间很长,虽然可以忽略依赖关系,但是可能会导致程序包安装后无法正常使用. yum程序包管理器( Yellow dog Updater, Modified):yum是基于RPM包管理,自动解决程序包间的依赖关系.根据配置文件的资源地

Cacti使用安装详解

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善.界面友好.软件 Cacti 的发展是基于让 RRDTool 使用者更方便使用该软件,除了基本的 Snmp 流量

codis-3.2.8集群部署详解

codis-3.2.8集群部署详解 一.概要 Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表https://github.com/CodisLabs/codis/blob/release3.1/doc/unsupported_cmds.md), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的

编译安装nginx及参数详解

centos平台编译环境使用如下指令 安装make: yum -y install gcc automake autoconf libtool make 安装g++: yum install gcc gcc-c++ 下面正式开始 --------------------------------------------------------------------------- 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩. 1.选定源码目录 可以是任

Redis详解(三)

一.Redis集群介绍 Clustering:redis 3.0之后进入生产环境分布式数据库,通过分片机制来进行数据分布,clustering 内的每个节点,仅有数据库的一部分数据;去中心化的集群:redis集群中的每一个节点,都可以作为集群的接入节点.//每一个node都有全局元数据,client访问哪一个node都可以获取所有的node client向任意node发起请求,该node会返回给client真正的key所在node,然后让client去获取.每一个节点持有全局元数据,但仅持有部分

GCC 编译详解 (转)

朋友用C调用lua的库,但是不能直接调用源码,必须要编译成静态链接库才可以使用,问学长说是因为要分开编译链接.这就不理解了,于是转一篇讲编译的文章学习一下,补补课… GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Java.Fortran.Pascal.Modula-3和Ada等多种语言,而且Gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种

LINUX下ORACLE相关的内核参数详解

ORACLE相关的内核参数详解 1.kernel.sem [[email protected] ~]# cat /proc/sys/kernel/sem 250         32000    100         142 [[email protected] ~]#  ipcs -sl ------ Semaphore Limits -------- max number of arrays = 142 max semaphores per array = 250 max semaphor