前言

Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多。好在Linux为我们提供了自动生成功能完善的Makefile文件的工具autoconf/automake。本文讲述如何使用它们生成Makefile文件。要用到的工具组主要包括autoconf,automake,perl语言环境和m4。

因此,我们在使用autotools(automake,autoconf, autoheader, aclocal, autoscan, m4)生成Makefile之前, 应该先检查你的Linux系统中是否安装了automake,autoconf, autoheader,aclocal, autoscan, m4和perl。

  • 检查是否安装了automake如:$automake --version, 其他的autotools也可以如此检查。

说明:一般来说我们只要安装了automake, autoconf和m4其他的autotools也会自动安装,另外就是一定记得安装perl。

automake生成makefile的原理

下图是在网上参考的使用autotools生成Makefile的流程和原理图:

动手实战:

下面以实例演示如何使用automake等生成Makefile文件。

1.  写一个简单的程序

主源文件:main.c

#include<stdio.h>
#include"calculate.h"

int main(int arc, char* argv[])
{
printf("hello world!\n");

int sum = add(10, 15);
printf("sum:%d", sum);
return 0;
}

头文件:calculate.h

#ifndef __CALCULATE__
#define __CALCULATE__

int add(int a, int b);

#endif

源文件:calculate.c

#include<stdio.h>
#include"calculate.h"

int add(int a, int b)
{
printf("a:%d, b:%d\n", a, b);
return (a+b);
}

使用ls命令查看如下:

2.  使用autoscan生成configure.scan文件,将其重命名为configure.ac,并做适当修改

  • 执行autoscan并重命名后查看:

  • 查看configure.ac文件原始内容:

  • 修改configure.ac内容如下:

AC_INIT()中分别应用程序的名字,版本,和作者的联系方式(一般是Email)

添加一行AM_INIT_AUTOMAKE(),添加相应的参数。

最后AC_OUTPUT()生成的文件。

注意:最后一行AC_OUTPUT,如果文件中已经包含AC_CONFIG_FILES([Makefile])则默认保持:AC_OUTPUT。

3. 使用aclocal工具生成aclocal.m4

4. 使用autoconf工具生成configure文件

5. 使用autoheader工具生成config.h.in文件

6  用vi生成一个空文件Makefile.am, 并编辑如下三项

第一项:软件等级,有三个候选项:foreign,gnu,gnits

第二项:生成的可执行文件名

第三项:生成可执行文件所需的原始文件,有多个文件时用空格隔开,如本例

7  使用automake工具生成Makefile.in文件,内容如下

8  运行configure配置生成最终的Makefile文件

9. 使用Makefile编译,并运行编译后的程序:

附加:

还可以将代码打包发布:

这些命令功能强大,很多参数的意思这里没列出来,可以查阅相关书籍和手册。本文旨在展示整个过程,和最常用到的参数。以后写程序特别是文件较多时是不是方便了很多?

另外更复杂目录结构可以参考:https://blog.csdn.net/cloud_desktop/article/details/20559741

如何使用autotools/automake自动生成Makefile文件的更多相关文章

  1. 使用autoconf与automake自动生成MakeFile文件

    automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Makefile.am配置做出说明. 1.1. autotools的工作原理 autotools最终是为了生成Make ...

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

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

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

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

  4. 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例

    一个简单的执行程序的GNU automake自动生成Makefile的方法及案例 在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写 ...

  5. 自动生成Makefile文件

    主要的工具有autoscan, aclocal, autoheader, autoconfig,automake 1 .创建c源文件hello.c #include <stdio.h> i ...

  6. qmake使用方法(自动生成Makefile文件)

    qmake的使用简介 下面是qmake的简单介绍和使用要领,更为详细的信息请参阅手册 qmake的介绍 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makef ...

  7. 使用automake等命令自动生成Makefile文件

    参考:http://www.cnblogs.com/njucslzh/archive/2010/04/29/1723320.html

  8. GNU autotools自动生成Makefile 介绍

    一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...

  9. 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)

    转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...

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

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

随机推荐

  1. vue2 安装swiper

    npm install swiper@5.4.5 -D

  2. selenium执行下载多个文件操作,谷歌浏览器弹出"xxx想要下载多个文件"的处理方法

    背景:   使用selenium框架,批量下载多个目录的不同文件,而下载多个文件时,浏览器会弹出如下窗口 解决方案有2个:1.代码定位到元素并点击[允许].2.修改浏览器的设置,使其能够拥有自动下载的 ...

  3. 如何用python脚本采集某网图片

    一.前言: 今天学了两个工具urlopen  和etree,这两个小工具至关重要.urllib.request模块提供了最基本的构造HTTP请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还 ...

  4. 实验1task4

    <实验结论> #include <stdio.h> #include <stdlib.h> int main() { int x, t, m; x = 123; p ...

  5. 【阿里云ACP】-01(阿里云综述、弹性计算)

    课程能力 课程范围 ECS 磁盘 实例 磁盘 快照 镜像 网络 安全组 AS 伸缩组 伸缩配置 伸缩规则 伸缩活动 伸缩触发任务 伸缩模式 冷却时间 SLB 定义 实现原理 支持的协议 绘画保持 健康 ...

  6. K8S informer机制

    一.informer介绍 Kubernetes基于声明式API的设计理念,所谓声明式API,即告诉Kubernetes Controller资源对象的期望状态,这样为Kubernetes在事件通知后, ...

  7. Solution - ARC152D Halftree

    首先 \(n\) 为偶数时无解,这是显然的,因为一次加两条边,总边数一定是偶数. 下面我们证明 \(n\) 为奇数时一定有解,直接进行构造. 首先将每一个点编号加上 \(k\) 再模 \(n\) 的答 ...

  8. k8s资源清单

    资源清单就是k8s当中用来定义pod的文件,语法格式遵循yaml语法,在yaml当中可以定义控制器类型,元数据,容器端口号等等等....,也可以针对于清单对pod进行删除等操作. 我们可以用kubec ...

  9. maridb数据库表及字段增删改

    mariadb数据类型 mariadb数据类型分为数字.日期.时间以及字符串值. 适用类型原则:够用就行,尽量使用范围小的,而不用大的 常用数据类型: 1.整数 int,bit   #例如 年纪 适用 ...

  10. while跟if循环

    While(表达式)//循环,达成括号里的条件,一直循环执行里面的程序直到得出的值不成立后退出循环 { 循环体} 几个练习题: using System; namespace while练习2 { c ...