(转帖整理)Linux下的Autoconf和AutoMake(理论篇) 1
在搜索网上资料过程中,这是感觉最简洁有效的一篇文章,特进行转帖记录,并根据情况对部分内容进行了修改。
原帖传送门:Linux下的Autoconf和AutoMake
1、工具安装
在开始使用autoconf和automake之前,首先确认你的系统安装有GNU的如下软件: automake/autoconf/m4/perl。
如果你需要产生共享库(shared library)则还需要GNU Libtool。
如果使用RedHat的Linux版本,这几个工具会自动安装,我试验中用SUSE11也安装了所有程序。
(可以对每个软件查询版本号来确认是否已经进行了安装)
①autoconf:是一个shell脚本的工具,可以自动地配置软件源代码包以适应多种UNIX类系统。
由autoconf生成的配置脚本在运行的时候不需要用户的手工干预;通常它们甚至不需要手工给出参数以确定系统的类型。
其中autoconf需要用到m4,便于生成脚本。
②automake:是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义。生成的Makefile.in,服从GNU Makefile标准。
为了生成Makefile.in,automake还需用到perl(它本身就是一个perl程序)。
2、使用流程(此图完美分解了整个流程!)
①由你的源文件通过autoscan命令,生成configure.scan文件,然后修改configure.scan文件并重命名为configure.in。
configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。
configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
(在AC_INIT之前还可以有AC_PREREQ宏,表示autoconf的版本要求)
②由aclocal命令,从configure.in生成aclocal.m4
③由autoconf命令,生成configure
④编辑各个Makefile.am文件,并由automake —-add-missing 命令生成Makefile.in文件
⑤运行configure命令,从Makefile.in文件生成Makefile
⑥运行make命令,生成文件
4、如何编写makefile.am文件
在makefile.am档中需要定义要产生的目标,具体包括:
①AUTOMAKE_OPTIONS:设定automake的选项。automake主要是帮助开发GNU软件的人员维护软件套件,一般在执行automake时会检查目录下是否存在标准GNU套件中应具备的文件档案,例如NEWS、AUTHOR、ChangeLog等,设成foreign时,automake会改用一般软件套件标准来检查,而gnu是缺省设置,该级别下将尽可能地检查包是否服从GNU标准,gnits是严格标准,不推荐。
②bin_PROGRAMS:定义要产生执行档的名称(也就是生成文件的名称)。产生多个执行档的话,需要用空格符隔开。
③hello_SOURCES:定义hello这个执行档的源文件(这个hello前缀根据具体项目生成文件名称确定),如果该程序由多个原始档产生,必须把所用到的原始档都列出来,空格符隔开,例如hello_SOURCES = hello.c main.c hello.h(列出所有的头文件和源文件)。如果定义了多个执行档,则对每个执行档都要定义相对的filename_SOURCES。
举例:
④
noinst_LIBRARIES=libhello.a #第一行noinst 表示生成的是静态库。如果要把静态库生成到其他地方,可以在=后面加上路径。
libhello_a_SOURCES=test.c #第二行表示用来生成静态库的源文件。
AUTOMAKE_OPTIONS=foreign #第三行AUTOMAKE_OPTIONS 是Automake 的选项。
⑤
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libhello.la #这里用la就表示是生成动态库了
libhello_la_SOURCES=test.c
⑥
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include #第二行指定头文件的位置,-I 是idirafter 的缩写。
bin_PROGRAMS=hello #第三行指定生成可执行文件名hello,在这里可执行文件生成在src 下
hello_SOURCES=hello.c #第四行指定生成可执行文件hello 的源代码文件
hello_LDADD=../lib/libhello.a #第五行指定需要使用静态库的位置。
备注说明第三行:
如需要把可执行文件生成到/root/test 目录下,则写法为:bin_PROGRAMS=/root/test/hello
后面的第四、五行也相对应地变为:
_root_test_hello_SOURCES=hello.c
_root_test_hello_LDADD=../lib/libhello.a
5、产生的Makefile结构
利用 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 档已经准备好可供散播了。这个检查非常有用,检查过关的套件,基本上可以给任何一个具备 GNU 发展环境的人去重新编译。
6、其他
其它有关开发 GNU 程序或 C 程序设计及 Makefile 的详细运用及技巧,建议从 GNU Coding Standards3 (GNU 编码标准规定) 读起,里面包含了 GNU Makefile 惯例,还有发展 GNU 软体套件的标准程序和惯例。这些 GNU 软体的线上说明文件可以在 http://www.gnu.org/ 这个网站上找到。
《CentOS下的Autoconf和AutoMake(实践篇) 2》
《CentOS下的Autoconf和AutoMake(完善篇) 3》
(转帖整理)Linux下的Autoconf和AutoMake(理论篇) 1的更多相关文章
- CentOS下的Autoconf和AutoMake(完善篇) 3
在<实践篇>之后,由于需求不断修正,所以这篇是针对<实践篇>的一些完善.(以后内容会不定期增加完善) 1.不想链接到math的动态库,想连接到静态库①使用命令ldd ./mys ...
- Linux下使用autoconf 和 automake 编译简单的HelloWorld
使用过开源C/C++项目的同学都知道,标准的编译过程已经变成简单的三部曲:./configure /make/make install,使用起来很方便,不像平时自己写代码,要手写一堆复杂的makefi ...
- CentOS下的Autoconf和AutoMake(实践篇) 2
阅读过<Linux下的Autoconf和AutoMake(理论篇)>之后,进入到实践环节.实验环境:CentOS release 6.7 (Final) x64 1.检查一下这4个工具是否 ...
- 笔记整理——Linux下C语言正则表达式
Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论 ...
- 归纳整理Linux下C语言常用的库函数----文件操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- 【转帖】linux下的各个目录的含义
linux下的各个目录的含义 http://embeddedlinux.org.cn/emb-linux/entry-level/200809/22-85.html/bin/usr/local/bin ...
- 整理 Linux下列出目录内容的命令
在 Linux 中,有非常多的命令可以让我们用来执行各种各样的任务.当我们想要像使用文件浏览器一样列出一个目录下的内容时,大家第一时间想到的是 ls 命令.但只有 ls 命令能实现这个目的吗?显然不是 ...
- linux下使用autoconf制作Makefile
第一步:常用工具安装:正所谓:"工欲善其事,必先利其器".我们常用的工具主要有GNU AutomakeGNU AutoconfGNU m4GNU Libtool1.查看自己系统中是 ...
- 归纳整理Linux下C语言常用的库函数----时间日期数学及算法
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
随机推荐
- 怎么把<li>标签里的内容付给文本框
如果你不想使用jq,那就可以这样先写一个js函数,function val(a){alert(a);} 然后在li标签上添加点击事件,调用这个函数并将当前li里的文本当做参数一起发送给js函数< ...
- 007-配置IP和DNS
2.配置DNS. 3.
- Mysql闭包表之关于国家区域的一个实践
在电商系统中,我们总是会遇到一些树形结构数据的存储需求.如地理区域.位置信息存储,地理信息按照层级划分,会分为很多层级,就拿中国的行政区域划分为例,简单的省-市-县-镇-村就要五个级别.如果系统涉及到 ...
- Perl中的哈希(四)
Perl中的哈希数据结构.相比较于数组,这种数据结构对于数据查找和统计更加方便. 一个特殊的哈希,%ENV,表示当前terminal下,通过setenv设置的variable的键值. 键:环境变量名, ...
- BabelMap 12.0.0.1 汉化版(2019年3月11日更新)
软件简介 BabelMap 是一个免费的字体映射表工具,可辅助使用<汉字速查>程序. 该软件可使用系统上安装的所有字体浏览 Unicode 中的十万个字符,还带有拼音及部首检字法,适合文献 ...
- idea 上搭建 Mybatis 逆向工程
网盘地址:https://pan.baidu.com/s/1VAILpdgQbFk9t89eEv_nWQ 提取码:xdyc
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...
- Java求两个数平均值
如何正确的求2个数的平均值.在练习算法二分查找的时候发现的,以前没有注意到的bug 备注:数据以int类型为例 一.以前的通用写法 /** * 求a+b平均值 * @param a * @param ...
- Python3基础 __doc__ 单行与多行函数文档
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 分布式系统一致性协议--Paxos算法
Paxos: Paxos算法背景介绍: Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与者逐步达成一致意见.用好理解的方式来说,就是在一个选举过程 ...