前言

如果你的入口文件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. CentOS7编译安装升级openssh8.7p1

    因生成环境服务器安全扫描出的漏洞问题,只能升级最新的openssh,适用于centos6和centos7的升级使用. 一.编译前工作 openssl版本要求1.0.1以上,zlib版本要求1.1.4以 ...

  2. Grafana v8.3.3 & jmeter-influxdb2-backend

    1. 说明 接上篇文章,今天继续聊Grafana & influxdb2-backend. 2. Grafana v8.3.3安装 下载rpm包 wget https://dl.grafana ...

  3. (Unity)XML文件读写与IO文件操作类使用介绍

    using System.Xml;                //xml文件操作命名空间 #region 写入操作 void WriteXMLFile(string _fileName) { Xm ...

  4. Nginx基本简述

    一.Nginx简介 Nginx是一个开源且高性能.可靠的HTTP中间件.代理服务. 开源:直接获取源代码 高性能:支持海量高并发 1.nginx应用场景: 静态处理   (对静态页面的处理,不管是ht ...

  5. [自动化]基于kolla的自动化部署ceph集群

    kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...

  6. RFC3918组播组容量测试——网络测试仪实操

    一.简介 1.RFC3918简介 历史 · 在1999年3月成为正式标准 功能 · 评测网络互连设备或网络系统的性能 · 网络设备: 交换机,路由器- 内容 · 定义了一整套测试方法,为不同厂家的设备 ...

  7. 【C# 线程】IOCP IO完成端口-Windows系统下常见的7种I/O模型

    一.IOCP(I/O Completion Ports)简介        要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构"Overlapped",Window ...

  8. Winform实现客户端的自动更新

              话不多说,直接上干货.当然也希望各位前辈多多指导. 自动更新客户端的设计原理图 请花两分钟时间,仔细阅读下面这张图,明白客户端自动升级的原理.        自动更新的效果图 1. ...

  9. PostgreSQL-PL/pgSQL控制结构

    PL/pgSQL的控制结构是最重要及最有用的一部分了,在实际工作场景都离不开业务处理逻辑,在写PL/pgSQL时,利用控制结构来操作数据.PL/pgSQL支持的控制结构与其他语言几乎差不多,比如:条件 ...

  10. 60天shell脚本计划-8/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年3月3日 --修改时间:2021年3月7日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在评 ...