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 ...
随机推荐
- iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案
原文详细步骤篇: iOS App转让流程详情教程篇 此文为遇到的一个问题,及如何解决: 问题描述: 转让app遇到这个错误,如何解决? 不解决这个,app是无法进行转让的. 原因分析: 这个是由于Te ...
- 你想要的iOS 小技巧总结
UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIView alloc] initWithFrame:CGRectMake(, , ...
- 升级cocoapods1.1.1版本
先切换gem源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是否切换成 ...
- 工程部署从tomcat6.0迁移到jboss6.0错误总结
2014-11-08 内容存档在evernote,笔记名"工程部署从tomcat6.0迁移到jboss6.0错误总结"
- java结合XPATH解析XML
做自动化测试的人,都应该对XPATH很熟悉了,但是在用JAVA解析XML时,我们通常是一层层的遍历进去,这样的代码的局限性很大,也不方便,于是我们结合一下XPATH,来解决这个问题. 所需要的JAR包 ...
- Andoird通信之简单聊天ChatApp
Android通信,大体上的逻辑是跟Java上的通信是差不多的,只是因为Android线程不能直接访问UI界面组件,所以在处理的时候有些麻烦,只要是通过Handle处理. 接下来是一个简单地手机聊天A ...
- 【MyBatis】MyBatis之如何配置
1,MyBatis简介 MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis 使用简 ...
- mysql单机多实例
在数据库服务器上,可以架构多个Mysql服务器,进行单机多实例的读写分离: 可以通过mysqld_multi来进行多实例的管理,mysqld_multi是用perl写的脚本,原理是通过mysql_ad ...
- C#基础第三天-作业答案-集合-冒泡排序-模拟名片
.冒泡排序 Console.WriteLine("对集合里的数进行排序,请输入第一个数:"); int a = int.Parse(Console.ReadLine()); Con ...
- JAVA日期查询:季度、月份、星期等时间信息
package com.stt.dateChange; import java.text.SimpleDateFormat; import java.util.Calendar; import jav ...