GNU make简介
引言
接触开源项目有一段时间了,对自动化编译工具一直很好奇。近期有时间正好整理下GNU make。后续可以深入了解下。
本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能、语法。
GNU Make
GNU Make主要用于自动化构建可执行程序(库文件),比较经典的用法如下:
make
make install
make clean
make distclean
Make使用makefile中规则构建程序。
makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个Shell脚本一样,其中也可以执行操作系统的命令。
makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。
说白了,GNU make搭建了构建和编译的桥梁,通过makefile实现了自动构建脚本的生成和执行,同时支持自定义扩展(比如make clean、make install)。
Make的功能
- 自动化构建和安装
- 增量编译及自动更新
- 适用于多语言,比如c/c++、java、php等
- 支持自定义功能扩展(只要有意义,都是可以放到makefile中)
makefile的规则和目标
Make是一个规则解释语言,也是一种宏语言。
其核心是通过规则(Rule)描述了工作目标与依赖项之间的关系,通过这种关系实现自动构建,增量更新。其基本语法如下:
target: dependencies ...
commands
一个规则包括target,及其构建的依赖项(dependencies);comands前面必须是'\t'(Tab键),给出由依赖项构建target需要调用的shell脚本命令。在make调用时可以指定特定的target,
规则通常分为具体规则、模式规则、隐含规则等。
默认的c语言编译时,*.o依赖于*.c文件,这就是隐含规则,通常是约定俗成的。
写成下面形式:
*.o : *.c
$(CC) -c $(CFLAGS) $< -o $@
这种就是模式规则,是由用户自定义的规则。
如果是形式比如下面:
test: test.c
gcc $< -o $@
这就是具体规则。
由于makefile也是脚本的一种,通常支持通配符、变量、函数调用、宏等。有兴趣的可以参考下后续的资料。
注意上面的\(@、\)<是自动变量的一种,分别表示“工作目标的文件名”、“第一个必要条件的文件名”。
GNU make的学习
在很多开源项目中都会用到makefile,建议还是先了解下具体的使用,再学习Make的基本语法。其官网是:https://www.gnu.org/software/make/。
中文版的参考资料可以阅读:陈皓的"跟我一起写 Makefile"(麻烦自己搜索,网上很多版本)
也可以参考"Managing Projects with GNU Make"(中译名《GNU Make项目管理》)。
这本书上有比较全面详细的GNU Make介绍。
当然,最全面的还是GNU Make的用户手册,网上也有很多中译版。
小结
接触很久makefile,终于下定决心了解并深入下,虽然做不到专业,但是最起码能看懂,出现问题或疑问知道怎么解决,也算一种进步。后续有机会可以深入了解下Linux/开源项目的Makefile用法。另外,Android的NDK其实也是很多Makefile的集合。
这里说明一点,这不是一篇对GNU Make介绍很全面的文章,这仅仅是我在近期对GNU Make一个大概的认识,不全面的地方一定会有。
GNU make简介的更多相关文章
- GNU Binutils简介及基本用法
[时间:2017-06] [状态:Open] [关键词:GNU, binutils, as, ld, ar, 基础工具,linux,链接器,汇编器] 0 简介 GNU Binary Utilities ...
- GNU make使用(一)
[时间:2017-01] [状态:Self] [关键词:makefile,gcc,编译,动态库,静态库,可执行文件,shell命令] 引言 前段时间在Linux下编写一个可测试的程序发现,我对make ...
- 在Emacs中使用GNU Global
背景 在我平时用Emacs编写C代码时,经常需要进行代码的跳转,主要需求为函数定义的跳转,某个具体函数的调用查找,某个结构体的定义跳转以及结构体中具体某一项的跳转等,GNU Global就能完全满足我 ...
- GNU m4 教程[转]
原文:http://blog.csdn.net/timekeeperl/article/details/50738164 作者:garfileo 作者主页 本文整理自:https://segment ...
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- 嵌入式之:Linux下文件编译过程
本文主要三个部分:1.GNU GCC简介 2.C/C++交叉编译器arm-elf-gcc 3.make文件,用于工程管理 部分一:GNU GCC简介: 该编译器基本功能: (1)输出预处理后的文件(展 ...
- ubuntu上的arm-elf-tools -20040427.sh 下载及安装问题的解决
要完成uclinux在ARM上的移植,必须有这个工具. 下载地址:http://opensrc.sec.samsung.com/download.html 这个网站上还有许多其它资源可以下载.我选择 ...
- arm-linux-系列工具,ld,ar,as,objcopy
ref :http://www.360doc.com/content/14/0509/09/17268421_376009916.shtml 一.编译器相关知识学习 GNU GCC简介: GNU GC ...
随机推荐
- Android 桌面部件
桌面部件是一种利用AppWidget框架将应用程序的某个部件放在桌面. res/layout/digitalclock.xml <?xml version="1.0" enc ...
- iOS11新特性之LargeTitle
UI风格 在iOS 11中,系统APP使用了这种UI风格.这种风格最明显的变化就是使用了iOS 11的新特性--Large Title和新的SearchController. Demo GitHub: ...
- Spring MVC @PathVariable被截断
一.问题描述 一个控制器提供RESTful访问信息: @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + &qu ...
- 获取资源文件 r.drawable中的图片转换为drawable、bitmap
1. Resources resources = mContext.getResources(); Drawable drawable = resources.getDrawable(R.drawab ...
- golang ----map按key排序
实现map遍历有序 1. key有序 思路:对key排序,再遍历key输出value 代码如下:既可以从小到大排序,也可以从大到小排序 package main import ( "fmt& ...
- Activity的onPause()、onStop()和onDestroy()里要做的事情
onPause(): 当系统调用你的activity中的onPause(),从技术上讲,那意味着你的activity仍然处于部分可见的状态,当时大多数时候,那意味着用户正在离开这个activity并马 ...
- WSAAsyncSelect模型触发不了FD_Close消息?
原帖链接: http://bbs.csdn.net/topics/330164174 楼主: Server用WSAAsyncSelect模型,Client关闭程序时(不进行shutdown与close ...
- SharePoint 中时间轴 Timeline的实现
客户需要在OA中实现每日动态功能,能够记录每一位员工的每天的工作动态,我很快想到了时间轴,因为时间轴能很直观的现实员工每一刻的动态.就像Facebook的Timeline效果(点击查看). 尝试着搜索 ...
- 一个将java事物的非常好的栗子
地址:http://www.cnblogs.com/davenkin/archive/2013/02/16/java-tranaction-1.html
- MySQL积累
从csv文件写入mysql表:从/root/failure.csv读取数据写入表d_disk_failure,每行中的每个项用逗号分割,每个项只取用"包含的内容,如果没有"则取全部 ...