Linux系统里Makefile的automake使用方法

Linux下automake工具使用(自动构建Makefile文件) linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Automake的工具,用来自动生成makefile文件,为编译和安装程序提供了一个方便快捷的入口。 阅读详情
Linux系统里Makefile的automake使用方法

 

一、Makefile介绍
Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中纪录有文件的信  
息,在make时会决定在链接的时候需要重新编译哪些文件。

Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile可能还要跟着修改。这样就造成了手工书写Makefile的诸多问题,automake恰好能很好地帮助我们解决这些问题。

使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Makefile的automake生成方法。

二、使用的环境

本文所提到的程序是基于Linux发行版本:Fedora Core release 1,它包含了我们要用到的autoconf,automake。

三、从helloworld入手

我们从大家最常使用的例子程序helloworld开始。
下面的过程如果简单地说来就是:

新建三个文件:
helloworld.c
configure.in
Makefile.am
然后执行:
aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld
就可以看到Makefile被产生出来,而且可以将helloworld.c编译通过。
很简单吧,几条命令就可以做出一个符合惯例的Makefile,感觉如何呀。

现在开始介绍详细的过程:

1、建目录
在你的工作目录下建一个helloworld目录,我们用它来存放helloworld程序及相关文件,如
在/home/my/build下:
$ mkdir helloword
$ cd helloworld

2、 helloworld.c
然后用你自己最喜欢的编辑器写一个hellowrold.c文件,如命令:vi helloworld.c。使用下面的代码作为helloworld.c的内容。
int main(int argc, char** argv)
{
        printf("Hello, Linux World!/n");
        return 0;
}
完成后保存退出。
好了,现在在helloworld目录下就应该有一个你自己写的helloworld.c了。

3、生成configure
我们使用autoscan命令来帮助我们根据目录下的源代码生成一个configure.in的模板文件。
命令:
$ 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两个文件:
$ aclocal
$ls
aclocal.m4  configure.in  helloworld.c 
$ autoconf
$ ls
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既可以作为编译器的前端,也可以单独作为一个宏处理器。

4、新建Makefile.am
新建Makefile.am文件,命令:
$ vi Makefile.am
内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c

automake会根据你写的Makefile.am来自动生成Makefile.in。
Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。

5、运行automake
命令:
$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'

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

6、执行configure生成Makefile
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r--    1 yutao    yutao       15035 Oct 15 10:40 Makefile
你可以看到,此时Makefile已经产生出来了。

7、使用Makefile编译代码
$ make
if gcc -DPACKAGE_NAME=/"/" -DPACKAGE_TARNAME=/"/" -DPACKAGE_VERSION=/"/" -

DPACKAGE_STRING=/"/" -DPACKAGE_BUGREPORT=/"/" -DPACKAGE=/"helloworld/" -DVERSION=/"1.0/" 

-I. -I.     -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" /
  -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; /
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; /
else rm -f ".deps/helloworld.Tpo"; exit 1; /
fi
gcc  -g -O2   -o helloworld  helloworld.o 

运行helloworld
$ ./helloworld
Hello, Linux World!

这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。

你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。

感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。

四、深入浅出

针对上面提到的各个命令,我们再做些详细的介绍。

1、 autoscan

autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。

2、 configure.scan

configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in

3、 aclocal

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

4、 autoconf

autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。

在configure.ini中:

#号表示注释,这个宏后面的内容将被忽略。
AC_INIT(FILE)
这个宏用来检查源代码所在的路径。
AM_INIT_AUTOMAKE(PACKAGE, VERSION)
这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号:PACKAGE是软件包的名字,VERSION是版本号。当你使用make dist命令时,它会给你生成一个类似helloworld-1.0.tar.gz的软件发行包,其中就有对应的软件包的名字和版本号。
AC_PROG_CC
这个宏将检查系统所用的C编译器。
AC_OUTPUT(FILE)
这个宏是我们要输出的Makefile的名字。

我们在使用automake时,实际上还需要用到其他的一些宏,但我们可以用aclocal 来帮我们自动产生。执行aclocal后我们会得到aclocal.m4文件。

产生了configure.in和aclocal.m4 两个宏文件后,我们就可以使用autoconf来产生configure文件了。

5、 Makefile.am

Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容:
AUTOMAKE_OPTIONS

这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查。

bin_PROGRAMS

这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

helloworld_SOURCES

这个是指定产生“helloworld”时所需要的源代码。如果它用到了多个源文件,那么请使用空格符号将它们隔开。比如需要helloworld.h,helloworld.c那么请写成helloworld_SOURCES= helloworld.h helloworld.c。

如果你在bin_PROGRAMS定义了多个可执行文件,则对应每个可执行文件都要定义相对的filename_SOURCES。

6、 automake

我们使用automake --add-missing来产生Makefile.in。
选项--add-missing的定义是“add missing standard files to package”,它会让automake加入一个标准的软件包所必须的一些文件。
我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。

7、 Makefile

在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:
make
根据Makefile编译源代码,连接,生成目标文件,可执行文件。
make clean
清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
make install
将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
make dist
产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。
它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
make distcheck
生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
===============================================
helloworld-1.0.tar.gz is ready for distribution
===============================================
make distclean
类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。

五、结束语

通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。

如果你想写出更复杂的且符合惯例的Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件,比如:嵌入式数据库sqlite,单元测试cppunit


 

原地址:

http://www.chire8.cn/html/2008-1/2008-1-24/20081242670.html

STK中的传感器、雷达、发射机、接收机、天线 本文根据STK手册介绍了传感器、雷达、发射机、接收机、天线等对象的基本属性,简略分析了它们的不同之处。 阅读详情

相关推荐

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 245

ubuntu 自动生成 makefile

文件夹emit_signal包含文件callback.c main.c callback.h emit_signal.glade1. 进入相应的目录$cd emit_signal$autoscan  如果没有安装autoscan对应的package,系统会提示使用apt-get install安装autoscan是用来扫描源代码目录生成configure.scan文

gavinwjin的专栏 3196

halcon 深度学习标注_Halcon deep learning之目标检测笔记(一)

设置输入输出的路径输入路径有两个,一个是图像路径HalconImageDir,一个是Json文件路径PillBagJsonFile。这两个参数用于后续在图像路径中读取coco文件。输出路径首先定义一个新的文件夹路径,用于存放样本和模型文件等数据。设置基于深度学习的目标检测模型的路径,该模型文件以.hdl结尾。设置样本数据文件夹ExampleDataDir:'detect_pills_data'数据...

weixin_27885313的博客 2698

MakeFile

内核makefileifneq ($(KERNELRELEASE),) param-objs := file1.o file2.o obj-m := param.o else KDIR := /lib/modules/2.6.18-53.el5/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *

上官宏竹的专栏 722

全球尺度遥感云计算平台:Google Earth Engine

Google Earth Engine(GEE)是一个基于 Google 云服务基础设施的遥感大数据分析平台,它结合 Google 强大的云计算能力与 NASA、ESA、NOAA 等机构的空间数据,用于在全球尺度解决一些非常重要的社会问题:森林退化、粮食安全、灾害预警、水资源管理、气候监测以及环境保护等。 GEE 官方宣传视频(版权归 Google 所有) Spacefan 的视频 ·303播放 发展背景 2008 年,手握 40 多年 LandSat 数据的美国地质调查局(USG...

qq_41240287的博客 5013

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

makefile常用语法整理

?= ?= 表示只有在KDIR变量没有被赋值的时候才被赋值。 KDIR ?= "foo" KDIR ?= "bar" test: echo $(KDIR)

jerry的博客 395

[VT虚拟化驱动]正式启动VT

文章目录前言一、vmlaunch正式开始虚拟化二、使用步骤1.引入库2.读入数据总结 前言 本章开始真正实现一个最简单的VT框架,当然,只是能跑起来一个VT驱动了,没有并包括EPT,EPT后面再讲 提示:以下是本篇文章正文内容,下面案例可供参考 一、vmlaunch正式开始虚拟化 执行VMLAUNCH指令执行后,就正式进入虚拟化了,再该指令执行之前,得先保存Guest当前的环境,执行完VMLAUNCH后,要恢复Guest的环境,让Guest就像什么都没发生一样,所以需要保存和恢复Guest的各种寄存器的值

吾无法无天的博客 3661

Makefile

1. 获取内核版本当设备驱动需要同时支持不同版本内核时,在编译阶段,内核模块需要知道当前使用的内核源码的版本,从而使用相应的内核 API。2.4 与 2.6 内核下,源码头文件 linux/version.h 定义有:LINUX_VERSION_CODE ― 内核版本的二进制表示,主、从、修订版本号各对应一个字节;KERNEL_VERSION(major, minor, release

fade_away10的专栏 756

《python算法与数据结构2000讲》算法与数据结构总结

《python算法与数据结构2000讲》算法与数据结构总结

IT 甄选推荐 1102

VTK 显示大量点云数据及交互(点云拾取、着色、测量等)功能

VTK (Visualization Toolkit) 是一个强大的开源可视化库,非常适合处理点云数据。下面将介绍如何使用 VTK 显示大量点云数据,并实现点云拾取、着色、测量等功能。

深之JohnChen的专栏 1994

makefile详解

makefile: 管理项目。 命名:makefile Makefile --- make 命令 1 个规则: 目标:依赖条件 (一个tab缩进)命令 1. 目标的时间必须晚于依赖条件的时间,否则,更新目标 2. 依赖条件如果不存在,找寻新的规则去产生依赖条件。 ALL:指定 makefile 的终极目标。 2 个函数: src = $(wildcard ./*.c)...

一颗牙疼 311

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

Linux下automake应用

linux 环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用 make 工具,自动进行编译安装,但是手写 makefile 文件比较复杂,所幸在 GNU 的计划中,设计出了一种叫做 Autoconf/Automake 的工具,用来自动生成 makefile 文件,为编译和安装程序提供了一个方便快捷的入口。...

weixin_44453694的博客 897

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux下Makefile的automake生成全攻略

引自:http://www.knowsky.com/5180.html文/余涛    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。   在本文中,将给大家介绍如何使用autoconf和automake两个工具来帮助

幻想(airhand)空间 3294

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

使用automake自动生成makefile(上)

利用Linux下自动生成makefile的工具: automake, autoconf 生成makefile的一般过程 1.  创建工程目录和各个目录下的makefile.am。工程的名字一般和最终生成应用程序的名字相同。 [cpp] view plaincopy wzb@embedded ~]$ mkdir workspace  [wzb@emb

鱼思故渊的专栏 1085

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

autoMake工具使用

1、ac文件总是以AC_INIT开头,以AC_OUTPUT结尾。# 2、AC_INIT()中分别的是: 软件包的名字,版本,作者的联系方式(一般是Email)# 3、添加一行AM_INIT_AUTOMAKE(),里面填入: 程序名字,版本号。# 4、AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。# 5、AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。

m0_71782480的博客 743

Linux下Makefile的automake生成全…

Linux下Makefile的automake生成全攻略 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便。一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Makefile就不那么容易了。    在本文中,将给大家介绍如何使用autoconf和automake两个

shangyaowei的专栏 425

automake自动生成Makefile及遇到的问题

大家在Linux下面编写工程时可能都要遇到一个同样的问题,就是工程文件太大了编译的问题。我们可以使用很多方法: 1、       最原始的方法是每次编译都写一次gcc命令。 2、       手写Makefile文件,这个的前提是对Makefile的规则很熟悉。 3、       自动生成Makefile文件。 楼主在项目中也是遇到这样的问题,开始文件少的时候我每次都是键入gcc命令,然后

qianligaoshan的专栏 1378

automake 生成 makefile 简单介绍

本文转自:http://www.ibm.com,作者:杨 小华  苏 春艳本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法。主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Configure.in 的方法及其规则。引子无论是在Linux还是在Unix环境中,make都是一个非常重要的

flyingship23的专栏 814

Linux下Makefile的automake生成全攻略 2

4、新建Makefile.am  新建Makefile.am文件,命令: $ vi Makefile.am   内容如下: AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=helloworldhelloworld

hnhbdss的专栏 874

automake构建makefile文件

GNU Automake是一种编程工具,可以产生供make程序使用的Makefile,用来编译程序。它是自由软件基金会发起的GNU计划的其中一项,作为GNU构建系统的一部分。automake所产生的Makefile符合GNU编程标准。

Jaylen.sun的嵌入式之旅 465

【Linux笔记】【基础系列】 automake基础使用

【Linux笔记】【基础系列】 Automake基础使用 GNU Automake 是一个从模板文件创建符合 GNU 标准的 Makefile 的程序。Automake 从名为 Makefile.am 的文件中自动生成 Makefile.in。Automake 是一组称为 Autotools 的工具的一部分。其中包含名为 configure、configure.ac、Makefile.in、Makefile.am、aclocal.m4 等文件的包,其中一些是由 Autoconf 或 Automake 生成的

3320
上一篇: USB转232 电路答疑及常用芯片比较
下一篇: 一个 autoconf / automake 例子 --- 静态库、动态库 多源文件
newman0708
博客等级 码龄25年 32粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值