使用Automake和Autoconf 生成Makefile 实例

2024-01-20 23:38

本文主要是介绍使用Automake和Autoconf 生成Makefile 实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工具简介

GNU Autoconf Automake 这两个软件就是帮助程序开发者轻松产生Makefile 。用户只要使用 “./configure”, “make”, “make install” 就可以把程序安裝到系统中。

整个automake构建过程如下所示:

  •          

 

      Autoscan

扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

        Aclocal

根据已经安装的宏,用户定义宏和aclocal.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件aclocal.m4中。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”

m4 是一个通用的宏处理器,由 Brian Kernighan Dennis Ritchie 设计。m4 是基于 Ritchie 早先为 AP-3 小型机开发的 m3 宏处理器扩展的。m4也是 POSIX 标准中的一部分,所有版本的 UNIX 下都可用。虽然这种语言可以单独使用,但大多数人需要 m4 仅仅是因为 GNU autoconf 中的 “configure” 脚本依赖它。宏处理器(或预处理器)一般用作文本替换工具。最终用户经常会用它来处理要反复使用的文本模板,典型的是用于编程工具,还会用于文本编辑和文字处理工具。

      Autoheader

根据configure.ac中的某些宏,运行m4,生成config.h.in

        Autoconf

configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。

     Automake

automake将根据Makefile.am的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile

Automake,编程者只需要写一些预先定义好的宏 (macro),提交给Automake处理,就会产生一个可以供 Autoconf 使用的 Makefile.in文件。再配合使用 Autoconf产生的自动配置文件 configure 即可产生一份符合 GNU Makefile 惯例的 Makeifle 了。

 

应用实例

在开始使用 Automake 之前,首先确认你的系统安装有如下软件:

  1. GNU Automake
  2. GNU Autoconf
  3. GNU m4
  4. Perl
  5. GNU Libtool (如果你需要产生 shared library)

 

最好也使用 GNU C/C++ 编译器 GNU Make 以及其它 GNU 的工具程序来作为开发的环境,这些工具都是属于 Open Source Software 不但免费而且功能强大。

Automake 所产生的 Makefile 除了可以做到程序的编译和连接,还可以有把源码文件包装起来以供发布,所以程序源代码所存放的目录结构最好符合GNU 的标准惯例,接下来就用一个简单程序做例子。

工作目录如下:

                                               

 

使用 autoscan 产生一个 configure.ac 的原型,执行autoscan 后会产生一个configure.scan 的文件,可以用它作为 configure.ac文件的蓝本。

configure.scan改名为configure.ac,然后编辑 configure.ac文件

原始的configure.ac文件:

 

                      

        修改后的configure.ac文件:

        需要注意的是:需要手动添加AM_INIT_AUTOMAKE宏以及修改AC_OUTPUT中指定生成Makefile的位置

 

在需要生成Makefile的目录中添加Makefile.am 文件

在例子中,一共有2个目录需要生成Makefile,分别是代码根目录(即test-1.0),以及含有源代码的src目录。

根目录中的Makefile.am文件内容如下:

         

 

        src目录中的Makfile.am内容为:

 

注意:bin_PROGRAMS此变量表示编译后生成的是二进制执行程序,而且 = 后面可生成多个;_SOURCES的个数要与bin_PROGRAMS生成程序个数一致,_SOURCES前面的全称要与生成程序名完全一致,但命名规范略有不同,_SOURCES前面需要填上的字符串是将程序名(有路径的需包括路径)中除了数字和字母外的其他所有符号全改为“_”,比如图中的hello改为../hello的话,_SOURCES前面应改为“___hello”(此hello前有3个“_”)。

 执行 aclocal autoheader autoconf ,分別会产生 aclocal.m4 config.h.in configure 个文件

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

 

然后进入build目录,执行../configure

运行完configure之后,通过查看屏幕上显示的记录发现在当前目录build)以及子目录(build/src下已经产生了一个 Makefile 文件,输入make即开始编译:

 

最后可运行make install将软件安装到系统中,也可以使用make dist将所有的代码打包发布

或者

 需要注意的是,如果你最后要将程序打包发布,那么你需要在顶层目录的Makefile.am中加入:EXTRA_DIST=include,因为make dis默认是不打包include目录的。

上述产生Makefile 的过程和手动编写Makefile的方式非常不一样,使用 Automake 只需用到一些已经定义好的宏就可以了。我们把宏及目标 (target)写在Makefile.am 文件内,Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的Makefile.in 文件,然后再由configure这个 shell scrīpt 根据 Makefile.in 产生合适的Makefile

configure.ac 文件内容是一系列GNU m4 的宏,这些宏经Autoconf处理后会变成检查系统特性的shell scrīpts configure.ac文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须在所有其它宏前加入 AC_INIT 宏,然后在所有其它宏的最后加上 AC_OUTPUT宏。一般可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件,再对 configure.scan 做些修改成 configure.ac 文件。

编辑Configure.ac文件说明

Congfigure.ac中的宏说明如下:

AC_INIT(FILE) :该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。

AM_INIT_AUTOMAKE(PACKAGE,VERSION) 

这个是使用 Automake 所必备的宏,PACKAGE 是所要产生软件的名称,VERSION 是版本编号。

AC_PROG_CC检查系统可用的C编译器,若源代码是用C写的就需要这个宏。

AC_RPOG_CXX检查是否有C++编译器。

AC_OUTPUT(FILE) 

设置 configure 所要产生的文件,若是Makefile configure 便会把它检查出来的结果填充到Makefile.in 文件后产生合适的 Makefile

实际上,在使用 Automake 时,还需要一些其他的宏,这些额外的宏我们用 aclocal来帮助产生。执行 aclocal会产生aclocal.m4 文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉 Automake如何动作。

有了 configure.in aclocal.m4两个文件以后,便可以执行 Autoconf来产生 configure 文件了。

 

编辑Makefile.am 文件说明

Automake 会根据 configure.in 中的宏并在perl的帮助下把Makefile.am 转成 Makefile.in 文件。 Makefile.am 文件定义所要产生的目标:

AUTOMAKE_OPTIONS 

设置 Automake 的选项。Automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU 软件中应具备的文件,例如 ''NEWS''''AUTHOR''''ChangeLog'' 等文件。设置为foreign 时,Automake 会改用一般软件的标准来检查。

bin_PROGRAMS 定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。

hello_SOURCES 定义 ''hello'' 这个执行程序所需要的原始文件。如果 ''hello''这个程序是由多个原始文件所产生,必须把它所用到的所有原始文件都列出来,以空白符隔开。假设 ''hello'' 还需要 ''hello.c''''main.c''''hello.h'' 三个文件的话,则定义

hello_SOURCES= hello.c main.c hello.h 

如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES

编辑好 Makefile.am 文件,就可以用 Automake --add-missing来产生 Makefile.in。加上 --add-missing 选项来告诉 Automake顺便加入包装一个软件所必须的文件,如果你不使用该选项,Automake可能会抱怨缺少了什么文件。Automake产生出來的 Makefile.in 文件是完全符合 GNU Makefile 惯例的,只要执行 configure这个shell script 便可以产生合适的 Makefile 文件了。

 

make相关的命令

利用 configure 所产生的 Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下:

make all 产生设定的目标,既范例中的可执行文件。只敲入make 也可以,此时会开始编译源代码,然后连接并产生执行文件。

make clean 清除之前所编译的可执行文件及目标文件(object file, *.o)

make distclean 除了清除可执行文件和目标文件以外,也把 configure 所产生的 Makefile 清除掉。 通常在发布软件前执行该命令。

make install 将程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用 bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。

make dist 将程序和相关的文档包装为一个压缩文档以供发布 (distribution) 。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE VERSION 这两个参数是根据 configure.in 文中AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定义。在我们的例子中会产生 ''hello-1.0.tar.gz'' 的文件。

make distcheck make dist 类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz 文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all ,确认编译无错误以后,方显示这个 tar.gz 文件已经准备好并可以发布了。

 

 

这篇关于使用Automake和Autoconf 生成Makefile 实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627715

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];