前言

如果你的入口文件main.c和依赖的文件不是在同一个目录中的,使用Autotools来管理项目的时候会稍微复杂一下。

在不同的目录下,项目会生成*.a文件的静态连接(静态连接相当于将多个.o目标文件合成一个)。main.c会通过静态连接方式来实现连接。

执行过程

  1. 源代码例子

    这个例子中会加入libevent和pthread,让例子稍显复杂,这样可以详细的介绍不同目录下的Autotools的使用。

    我们创建两个目录:

    demo/ :放置helloworld.c主文件

    src/ :放置output.c output.h 函数文件

    demo中文件main.c:

    #include "../src/output.h"
    #include <stdio.h>
    #include <string.h> int main(int argc,char * argv[])
    {
    int n=15;
    printf("hello world %d \n",n);
    int test = output("from helloword.c");
    return 0;
    }

    output.h文件:

    #ifndef _OUTPUT_H
    #define _OUTPUT_H
    int output(char* data);
    #endif

    output.c

    #include <stdio.h>
    #include <string.h>
    int output(char* data)
    {
    printf("output data=%s\n",data);
    return 0;
    }
  2. 创建Makefile.am文件

    在项目根目录下先创建Makefile.am文件

    AUTOMAKE_OPTIONS=foreign
    SUBDIRS = src demo

    在demo/目录下创建Makefile.am文件

    AUTOMAKE_OPTIONS = foreign
    # AM_CPPFLAGS = -g -I$(top_srcdir)/src/ bin_PROGRAMS = helloworld
    helloworld_SOURCES = helloworld.c
    helloworld_LDADD = ../src/libsrc.a

    在src/目录下创建Makefile.am文件

    noinst_LIBRARIES = libsrc.a
    libsrc_a_SOURCES = output.c
    include_HEADERS = output.h

    说明:src/目录下面不加include_HEADERS也是可以运行的,但是在使用make dist打包命令后,并不会将include/文件夹打包进去,所以还是需要加上include_HEADERS。

  3. 执行Autoscan命令

    第一步,我们需要在我们的项目目录下执行autoscan命令。这个命令主要用于扫描工作目录,并且生成configure.scan文件。并且configure.scan需要重命令成configure.ac,然后编辑这个配置,我们才能继续执行后面的命令。
    修改configure.ac文件,主要添加AC_PROG_RANLIB(生成静态库);AC_PROG_LIBTOOL (用来生成动态库)

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
    AC_INIT(helloworld, 2.0, ggao@micron.com)
    AM_INIT_AUTOMAKE(helloworld, 2.0)
    AC_CONFIG_SRCDIR(demo/helloworld.c)
    AC_CONFIG_HEADERS([config.h]) # Generate static lib
    AC_PROG_RANLIB ##注意添加 # Checks for programs.
    AC_PROG_CC # Checks for libraries. # Checks for header files.
    AC_CHECK_HEADERS([string.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile
    demo/Makefile
    src/Makefile])
    AC_OUTPUT
  4. 执行 aclocal

  5. 运行 autoconf

  6. 运行 autoheader

  7. 手动添加必要的文件 NEWS,README,AUTHORS,ChangeLog

  8. 执行 automake --add-missing

  9. 执行 ./configure 生存 Makefile

====>>> 至此 Makefile 生成完毕。

如果要继续安装,

  1. $ make

  2. $ sudo make install 即可将可执行文件安装在 /usr/local/bin/ 目录下,以后就可以直接使用啦

  3. $ sudo make uninstall 即可将安装的可执行文件从 /usr/local/bin 目录下移除

如果要发布你的软件,

  1. $ make dist 即可打包生成 xxx-version.tar.gz 文件

如果要清理中间文件,

  1. make clean

  2. make distclean


Autotools运行流程

流程总结:

  1. 执行autoscan命令。这个命令主要用于扫描工作目录,并且生成configure.scan文件。

  2. 修改configure.scan为configure.ac文件,并且修改配置内容。

  3. 执行aclocal命令。扫描 configure.ac 文件生成 aclocal.m4文件。

  4. 执行autoconf命令。这个命令将 configure.ac 文件中的宏展开,生成 configure 脚本。

  5. 执行autoheader命令。该命令生成 config.h.in 文件。

  6. 新增Makefile.am文件,修改配置内容

  7. 执行automake --add-missing命令。该命令生成 Makefile.in 文件。

  8. 执行 ./congigure命令。将Makefile.in命令生成Makefile文件。

  9. 执行make命令。生成可执行文件。

automake的使用2的更多相关文章

  1. 第4月第1天 makefile automake

    1. gnu make的函数调用是$,比如 $(subst ee,EE,feet on the street) 规则中“TARGETS”可以是空格分开的多个文件名 a all: echo $(subs ...

  2. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

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

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

  4. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  5. 手动安装m4, autoconf, automake, libtool

    转自http://ruby-china.org/topics/2434 系列文章原载于自己的博客,TOPI.CO (http://topi.co) ,某天不小心就push错啦,懒得从头再来,上传到Ru ...

  6. unix automake 使用,快速生成你的Makefile

    使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...

  7. Linux下使用automake、autoconf生成configure文件

    一.生成configure过程中各文件之间的关系图 二.详细介绍 autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是con ...

  8. Linux下使用autoconf 和 automake 编译简单的HelloWorld

    使用过开源C/C++项目的同学都知道,标准的编译过程已经变成简单的三部曲:./configure /make/make install,使用起来很方便,不像平时自己写代码,要手写一堆复杂的makefi ...

  9. emacs工程管理,cedet ede插件自动构建Make,Automake

    鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...

  10. Linux autoconf和automake使用

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

随机推荐

  1. MyBatis封装JDBC具体实现

    关于xml等解析的工具基本均包含在org.apache.ibatis.builder包中,有包名可知基本使用建造者模式.这个包的主要功能两个: 1.解析XML配置文件和映射文件,xml子包中: 2.解 ...

  2. RSA公私钥生成与使用

    参考 KeyStore 简述 Keytool 简述 Certificate Chain (证书链) 简述 详解RSA加密算法

  3. python处理图像矩阵--值转为int

    1. 在用python处理图像数字矩阵时,若对矩阵进行了加减乘除等运算,可能会造成矩阵元素值溢出,然后某些元素值可能都被赋为255:之后若重新显示图像,可能会没有什么变化,此时,可以将运算后的矩阵值转 ...

  4. Gopher必读:HttpClient的两个坑位

    http是我们最常见的客户端/服务端传输协议,在golang中,默认的net/http包有一些坑位,需要调整以获得更加性能. 在golang程序中,我也遇到因为不合理使用 http client导致的 ...

  5. 目前市面上报表软件下载排名的TOP5

    目前,大部分的工作仍然离不开表格,而且工作表格的呈现更酷.效率要求更高.可以简化复杂的操作,大大提高工作效率.在企业管理中,报表可以以图表等简洁的方式向用户显示数据,从而提高工作效率.许多哦公司紧跟信 ...

  6. C#内联函数 特性 MethodImplOptions.AggressiveInlining)

    [MethodImpl(MethodImplOptions.AggressiveInlining)] 内联函数 Impl:implement的缩写 内联函数 在计算机科学中,内联函数(有时称作在线函数 ...

  7. Ng ML笔记

    目录 一.线性回归 1,假设函数.代价函数,梯度下降 2,特征处理 3,代价函数和学习速率 4,特征和多项式回归 5,正规方程 二.逻辑回归(Logistic Regression,LR) 1,假设函 ...

  8. MongoDB聚合查询及Python连接MongoDB操作

    今日内容概要 聚合查询 Python操作MongoDB 第三方可视化视图工具 今日内容详细 聚合查询 Python操作MongoDB 数据准备 from pymongo import MongoCli ...

  9. Write Combining Buffer

    现代CPU使用了很多技术来降低对内存存取数据的延时,因为CPU执行的速度实在是太快了,在从内存存取数据的约120ns中,可以执行数百条指令. 其中多级的缓存架构就是为了减少这种延时,来提高CPU的利用 ...

  10. LeetCode-006-Z 字形变换

    Z 字形变换 题目描述:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 ...