一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
在GNU的世界里,存在Automake这样的工具进行自动生成Makefile文件,automake是由Perl语言编写的,必须与GNU autoconf一并使用,具体的生成过程请参看GNU automake的wikipedia中的右下角的图,地址如下:http://en.wikipedia.org/wiki/Automake,由此图可看到使用自动生成Makefile的工具使用的流程,步骤主要如下:
- autoscan
- 修改生成的configure.scan为configure.in
- aclocal
- autoheader
- autoconf
- 创建Makefile.am并进行具体内容的写入
- automake
- automake
- ./configure生成Makefile
- make得到可执行程序
光空说太抽象了,那么来一个简单的例子吧,
0. 创建一个printf("Hello world!\n")的小程序,创建目录hello后创建hello.c,
ufo@ufo:~/hello$ ls
hello.c
那么下一步即可开始automake的工作了,
1、使用autoscan生成configure.scan
ufo@ufo:~/hello$ autoscan
ufo@ufo:~/hello$ ls
autoscan.log configure.scan hello.c
ufo@ufo:~/hello$ aclocal
aclocal: `configure.ac' or `configure.in' is required
2、在上一步中直接执行aclocal时出现以上的提示,那么就要将生成的configure.scan修改为configure.ac或configure.in再进行aclocal的执行;
ufo@ufo:~/hello$ mv configure.scan configure.in
ufo@ufo:~/hello$ ls
autoscan.log configure.in hello.c
3、执行aclocal
ufo@ufo:~/hello$ aclocal
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log configure.in hello.c
4、执行autoheader
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log config.h.in configure.in hello.c
5、执行autoconf
ufo@ufo:~/hello$ autoconf
ufo@ufo:~/hello$ ls
autom4te.cache autoscan.log config.h.in configure configure.in hello.c
6、创建Makefile.am
ufo@ufo:~/hello$ vim Makefile.am
ufo@ufo:~/hello$ cat Makefile.am
bin_PROGRAMS=hello
hello_SOURCES=hello.c
关于Makefile.am中的具体内容的意思是说生成的可执行文件的名称为hello,对应的源代码为hello.c。
7、执行automake
ufo@ufo:~/hello$ automake
configure.in: no proper invocation of AM_INIT_AUTOMAKE was found.
configure.in: You should verify that configure.in invokes AM_INIT_AUTOMAKE,
configure.in: that aclocal.m4 is present in the top-level directory,
configure.in: and that aclocal.m4 was recently regenerated (using aclocal).
automake: no `Makefile.am' found for any configure output
automake: Did you forget AC_CONFIG_FILES([Makefile]) in configure.in?
这时出错了,是说configure.in文件中的AM_INIT_AUTOMAKE没有找到,只有修改configure.in
文件后再从第三步进行重新执行,configure.in中的AC_INIT行下添加
AM_INIT_AUTOMAKE(hello,1.0),格式为AM_INIT_AUTOMAKE(package,version),再修改AC_OUTPUT为AC_OUTPUT(Makefile);
修改完configure.in文件后,再次执行2~7;
8、执行automake
ufo@ufo:~/hello$ automake
configure.in:6: required file `./install-sh' not found
configure.in:6: `automake --add-missing' can install `install-sh'
configure.in:6: required file `./missing' not found
configure.in:6: `automake --add-missing' can install `missing'
Makefile.am: required file `./INSTALL' not found
Makefile.am: `automake --add-missing' can install `INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: required file `./COPYING' not found
Makefile.am: `automake --add-missing' can install `COPYING'
Makefile.am: required file `./depcomp' not found
Makefile.am: `automake --add-missing' can install `depcomp'
按照提示创建缺少的文件,
ufo@ufo:~/hello$ touch NEWS README AUTHORS ChangeLog
再执行:
ufo@ufo:~/hello$ automake --add-missing
没有出错的情况下再次执行automake;
ufo@ufo:~/hello$ ls
aclocal.m4 ChangeLog configure.in INSTALL missing
AUTHORS config.h.in COPYING install-sh NEWS
autom4te.cache config.h.in~ depcomp Makefile.am README
autoscan.log configure hello.c Makefile.in
此时已经生成了生成Makefile文件的cinfigure脚本;
9、./configure生成Makefile
ufo@ufo:~/hello$ ls Makefile
Makefile
10、make得到可执行程序
ufo@ufo:~/hello$ make
make all-am
make[1]: 正在进入目录 `/home/ufo/hello'
gcc -DHAVE_CONFIG_H -I. -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
mv -f .deps/hello.Tpo .deps/hello.Po
gcc -g -O2 -o hello hello.o
make[1]:正在离开目录 `/home/ufo/hello'
ufo@ufo:~/hello$ ls
aclocal.m4 config.h configure hello.c Makefile.am stamp-h1
AUTHORS config.h.in configure.in hello.o Makefile.in
autom4te.cache config.h.in~ COPYING INSTALL missing
autoscan.log config.log depcomp install-sh NEWS
ChangeLog config.status hello Makefile README
ufo@ufo:~/hello$ ./hello
Hello World!
这就是牛X的automake的例子;关于其中的细节日后有空再表了
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例的更多相关文章
- GNU autotools自动生成Makefile 介绍
一.目的 使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用"./configure", "ma ...
- 使用autoconf与automake自动生成MakeFile文件
automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Makefile.am配置做出说明. 1.1. autotools的工作原理 autotools最终是为了生成Make ...
- 简单实例,说明自动生成Makefile的详细过程
为了编译一个简单的源文件main.c,需要自动生成一个makefile,以下是步骤: 第一步:----------在/root/project/main目录下创建一个文件main.c,其内容如下:-- ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- 自动生成 Makefile (automake/autoconf 入门)
作为Linux 下的程序开发人员,大家一定都遇到过Makefile ,用make 命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile ,如果要想写出一个符合自由软件 ...
- 自动生成makefile
原文 http://www.laruence.com/2009/11/18/1154.html 作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实 ...
- 如何自动生成Makefile
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- 使用autotools自动生成Makefile并在此之上使用dh-make生成可发布的deb程序包(详解)
转自:http://blog.csdn.net/longerzone/article/details/12705507 一.前言 本文将介绍如何使用autotools生成一个Makefile文件,并在 ...
随机推荐
- JS 仿淘宝幻灯片 非完整版 小案例
仿淘宝幻灯片,基础版,后期效果是要做到每次点击小圆点,切换都无缝 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" &quo ...
- UINavigationController具体解释(一)
@UINavigationControlle简单介绍: 1.导航控制器,专门管理控制器的控制器. 2.採用栈的方式管理全部controller,每一个controller管理各自的视图 @UINavi ...
- 读书笔记-HBase in Action-第一部分 HBase fundamentals
新项目准备上HBase.HBase眼下由组里某牛负责.本着学会使用HBase的目标,先阅读下HBase in Action,一共十章组织成三部分,须要学习的内容包含HBase基本实现原理,用法,Sch ...
- pytest 失败用例重试
https://www.cnblogs.com/jinzhuduoduo/articles/7017405.html http://www.lxway.com/445949491.htm https: ...
- Android Fragment和Activity的交互介绍
Fragment和Activity的交互 一个Fragment的实例总是和包括它的Activity直接相关. fragment能够通过getActivity() 方法来获得Activity的实例.然后 ...
- LeetCode208:Implement Trie (Prefix Tree)
Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs a ...
- map集合遍历的五种方法
package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...
- LBS(定位)的使用
一.LBS(定位)的使用 1.使用框架Core Location 2.CLLocationManager (1)CoreLocation中使用CLLocationManager对象来做用户定位 (2) ...
- 三个命令解决ASTGO服务器重启后各种问题
SSH 命令方式登录到服务器,依次执行下面三个命令. service httpd restart service mysqld restart safe_asterisk 前面两个命令提示无效,尝试从 ...
- Python定制容器
Python 中,像序列类型(如列表.元祖.字符串)或映射类型(如字典)都是属于容器类型,容器是可定制的.要想成功地实现容器的定制,我们需要先谈一谈协议.协议是什么呢?协议(Protocols)与其他 ...