引言

接触开源项目有一段时间了,对自动化编译工具一直很好奇。近期有时间正好整理下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简介的更多相关文章

  1. GNU Binutils简介及基本用法

    [时间:2017-06] [状态:Open] [关键词:GNU, binutils, as, ld, ar, 基础工具,linux,链接器,汇编器] 0 简介 GNU Binary Utilities ...

  2. GNU make使用(一)

    [时间:2017-01] [状态:Self] [关键词:makefile,gcc,编译,动态库,静态库,可执行文件,shell命令] 引言 前段时间在Linux下编写一个可测试的程序发现,我对make ...

  3. 在Emacs中使用GNU Global

    背景 在我平时用Emacs编写C代码时,经常需要进行代码的跳转,主要需求为函数定义的跳转,某个具体函数的调用查找,某个结构体的定义跳转以及结构体中具体某一项的跳转等,GNU Global就能完全满足我 ...

  4. GNU m4 教程[转]

    原文:http://blog.csdn.net/timekeeperl/article/details/50738164 作者:garfileo  作者主页 本文整理自:https://segment ...

  5. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile

    GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...

  6. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  7. 嵌入式之:Linux下文件编译过程

    本文主要三个部分:1.GNU GCC简介 2.C/C++交叉编译器arm-elf-gcc 3.make文件,用于工程管理 部分一:GNU GCC简介: 该编译器基本功能: (1)输出预处理后的文件(展 ...

  8. ubuntu上的arm-elf-tools -20040427.sh 下载及安装问题的解决

    要完成uclinux在ARM上的移植,必须有这个工具. 下载地址:http://opensrc.sec.samsung.com/download.html 这个网站上还有许多其它资源可以下载.我选择 ...

  9. arm-linux-系列工具,ld,ar,as,objcopy

    ref :http://www.360doc.com/content/14/0509/09/17268421_376009916.shtml 一.编译器相关知识学习 GNU GCC简介: GNU GC ...

随机推荐

  1. spring事务管理——编程式事务、声明式事务

    本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 ...

  2. hihocoder234周 计算不包含黑点的矩形个数

    题目链接 问题描述 一个棋盘有n条横线,m条竖线,上面有k个黑点,问有多少个不包含黑点的矩形. 数据范围: n和m最大为1000,k最大为10 方法一:动态规划 复杂度n*m*k. import ja ...

  3. apache kafka系列之Producer处理逻辑

     最近研究producer的负载均衡策略,,,,我在librdkafka里边用代码实现了partition 值的轮询方法,,,但是在现场验证时,他的负载均衡不起作用,,,所以来找找原因: 下文是一篇描 ...

  4. Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)

    一段PHP程序执行报错: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 261181 ...

  5. springAOP记录用户操作日志

    项目已经开发完成,需要加用户操作日志,如果返回去加也不太现实,所以使用springAOP来完成比较合适. 注解工具类: @Retention(RetentionPolicy.RUNTIME) @Tar ...

  6. 看过这两张图,就明白 Buffer 和 Cache 之间区别

    Buffer常见的是这个: 对,就是铁道端头那个巨大的弹簧一类的东西.作用是万一车没停住,撞弹簧上减速慢,危险小一些.叫缓冲. Cache常见的是这个: 没错,就是一种保管箱.看到右边那个被锈掉的Fo ...

  7. lamp虚拟主机的常用配制选项

    <VirtualHost *:80>    ServerAdmin m.koobird.com    DocumentRoot "/var/www/html/xinyou&quo ...

  8. Thinking In Design Pattern——MVP模式演绎

    原文<Thinking In Design Pattern——MVP模式演绎>不知为何丢失了,故重新整理了一遍. 目录 What Is MVP Domain Model StubRepos ...

  9. Mac OS X 下多个JDK版本的切换小技巧

    如果在系统中安装了多个Java JDK 版本,可能会根据项目或编译环境的不同来回切换,下面有两种非常方便的方法供大家选择. 我的机器上有 Java 7 和 Java 8,大家根据自己的 JDK 版本自 ...

  10. GIT 简单版

    Git规范 by 程序亦非猿 2016.4.6 这又是一篇我在公司分享的,想制定一下Git的规范,有兴趣的可以看看~ 上一篇在这里 分支模型 每个项目必须要有master.develop分支. 每个开 ...