automake---让Makefile变得更专业一点儿
一般我们装软件时,都要运行
./configure --prefix=/usr/local
make
make install
看着不断刷新的屏幕,总感觉真得好高深呀,其实我们的程序也可以这样子。
下面,我将自己以前编写的一个程序改造成很专业的样子。
下面的Makefile是我自己写的:
objects=allotter/array.o config/config.o rbtree/rbtree.o thread_pool/thread_pool.o workers/workers.o hash_map/hash_map.o tool/tool.o
CC=gcc -g -lstdc++ server/server : $(objects) server/server.c
$(CC) -o server/server -lpthread -levent $(objects) server/server.c allotter/array.o : allotter/array.h allotter/array.c
$(CC) -c -o allotter/array.o allotter/array.c config/config.o : config/config_file.h config/config_file.c
$(CC) -c -o config/config.o config/config_file.c rbtree/rbtree.o : rbtree/rbtree.h rbtree/rbtree.c
$(CC) -c -o rbtree/rbtree.o rbtree/rbtree.c thread_pool/thread_pool.o : thread_pool/thread_pool.h thread_pool/thread_pool.c
$(CC) -c -o thread_pool/thread_pool.o thread_pool/thread_pool.c workers/workers.o : workers/workers.h workers/workers.c
$(CC) -c -o workers/workers.o workers/workers.c hash_map/hash_map.o : hash_map/hash_map.h hash_map/hash_map.c
$(CC) -c -o hash_map/hash_map.o hash_map/hash_map.c tool/tool.o : tool/tool.h tool/tool.c
$(CC) -c -o tool/tool.o tool/tool.c clean:
-rm -f server/server $(objects)
总感觉不够专业,于是就研究了专业的Makefile的写法。
首先对程序进行一下简介:
1,程序用C语言写成,用到了C++的unordered_map,所以为了方便编译,统一改成.cc文件,用g++编译
2,所有程序文件有十几个,如下, 所有的程序放在一直,没有子目录,程序依赖pthread和libevent两个库。
array.h array.cc
rbtree.h rbtree.cc
workers.h workers.cc
tool.h tool.cc
hash_map.h hash_map.cc
config_file.h config_file.cc
thread_pool.h thread_pool.cc node.h
server.cc
开始步入正题,一步一步生成Makefile
1,在目录中运行autoscan,会生成configure.scan文件,改名为configure.in,打开编辑,如下,红色的部分是我改的,或我添加的
检查libevent和pthread库的两句是自动生成的,如果没有生成,我们也可以自己添加
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ(2.62)
#对我们的程序起一个名字(不是最后可执行文件的名字),表示版本号为1.o,名字叫server1
AC_INIT(server1, 1.0, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([hash_map.cc])
AC_CONFIG_HEADERS([config.h])
#表示我们要生成一个makefile文件
AM_INIT_AUTOMAKE(server1,1.0)
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC # Checks for libraries.
# FIXME: Replace `main' with a function in `-levent':
#检查libevent库
AC_CHECK_LIB([event], [main])
# FIXME: Replace `main' with a function in `-lpthread':
#检查pthread库 AC_CHECK_LIB([pthread], [main]) # Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h fcntl.h netinet/in.h stdint.h stdlib.h string.h sys/socket.h syslog.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T # Checks for library functions.
AC_FUNC_MALLOC
AC_CHECK_FUNCS([bzero ftruncate gettimeofday memset socket strcasecmp strchr strerror strrchr]) AC_CONFIG_FILES([Makefile])
AC_OUTPUT
2,运行aclocal,生成一个aclocal.m4文件,我们不用去管它
上一步生成的文件中有很多宏,所以需要解释这些宏,于是aclocal就生成这些宏的解释程序,供下面使用.
3,运行autoheader生成一个头文件
4, 运行autoconf生成configure
5,建一个名字叫Makefile.am的文件,内容如下:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=server1
server1_SOURCES=server.cc array.h array.cc config_file.h config_file.cc rbtree.h rbtree.cc thread_pool.h thread_pool.cc workers.h workers.cc hash_map.h hash_map.cc tool.h tool.cc
server1_LDFLAGS= -lpthread -levent
第二行表示生成的可执行程序的名称
第三行列出整个项目所有的源文件,automake会根据我们的源文件分别进行编译,链接
第四行加一些链接标记
6,运行automake,如果有问题,根据提示运行automake --add-missing
7,其实到现在已经完成了,看是不是生成了个Makefile.in文件,有了这个文件,可以通过运行./configure 来生成 Makefile文件了
8,运行make,是不是屏幕就开始刷新了,然后我们可以运行make dist来打包一个部署压缩包,就可以发布了。
总结:
整个过程需要我们介入的就是第一步和第五步,第一步只是细小的改动,第五步需要我们整个编写Makefile.am文件。
下面的文章介绍的比较好,推荐一下:
http://www.ibm.com/developerworks/cn/linux/l-makefile/
以上过程都亲自操作过,生成程序可以正常运行,代码可下载:
github下载:https://github.com/hxdoit/real_time_rank/tree/master/server1-1.0
百度网盘下载:http://pan.baidu.com/s/1pFoEB
automake---让Makefile变得更专业一点儿的更多相关文章
- Makefile 10——打造更专业的编译环境-huge项目
先手工创建几个文件目录: 接下来先创建code/foo/src目录下的Makefile: .PHONY: all clean MKDIR = mkdir RM = rm RMFLAGS = -rf C ...
- 使用autoconf和automake生成Makefile文件(转)
Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
- 运用Autoconf和Automake生成Makefile的学习之路
作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...
- 例解 autoconf 和 automake 生成 Makefile 文件
本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Con ...
- [转帖]web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全. https://www.cnblogs.com/1996V/p/7458377.html 感谢原作者写的内容 安全 ...
- LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。
Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...
- 深入解析 Kubebuilder:让编写 CRD 变得更简单
作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubern ...
- 快开宝PDA开单器出入库扫码:让批发零售变得更简单
快开宝PDA开单器出现前 批发商户是这样开单和管理的 ★员工痛苦:需要记客户.价格.库存等等,应对报错价.错漏单.盘错货等各种状况. ★老板麻烦:每天要守店.对单.核账,经常因错漏单.库存乱.积压货. ...
随机推荐
- 最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)
最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最 ...
- php微信2 获取自定义菜单中的access_token
//自定义菜单中获取access_token static function get_access_token($appid,$secret){ $url="https: ...
- Visual EmbedLinux Tools:让vs支持嵌入式Linux开发(转)
转自:http://blog.csdn.net/lights_joy/article/details/49499743 1 什么是Visual EmbedLinux Tools Visual Embe ...
- React 学习资源分享 菜鸟刚学5天 博客写的不多 不懂写博客的套路
http://www.ruanyifeng.com/blog/2015/03/react.html 首先个人强烈推荐 阮一峰的React基础 细细过一遍,看得出大师的用心良苦 然后就开始看书般的过ht ...
- jQuery 侧栏菜单点击body消失
其实就在弹出菜单时 让菜单外部有个全屏大小的遮罩层
- Android Handler、Lopper消息驱动机制
Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队例(MesageQueue),应用程序的主线程不断地从这个消息队例中获取消息(Mesage),然后对这些消息进行处理(Han ...
- Python 手册——调用解释器
通常Python的解释器被安装在目标机器的 /usr/local/bin/python 目录下:把 /usr/local/bin 目录放进你的UNIX Shell 的搜索路径里,确保它可以通过输入py ...
- typedef与define
一.typedef用法 typedef常用来定义一个标识符及关键字的别名,它生效是在语言编译过程,但它并不实际分配内存空间.typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性” ...
- 搭建Tornado+Nginx
Tornado一个高效的异步非阻塞式的实时Web服务器,是Facebook旗下的 FriendFeed 网站开源Web服务器版本.但是它内置的HTTP服务器功能有限,不能在生产环境下使用. 在 Fri ...
- mysql 中创建存储过程
mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...