Makefile概述


一、Makefile里有什么?

Makefile里主要包含5个东西:显式规则、隐晦规则、变量定义、文件指示和注释

1、显式规则:显式规则说明如恶化生成一个或多的目标文件,包含要生成的文件,文件的依赖文件,生成的命令

2、隐晦规则:由make自动推动功能完成

3、变量定义:变量一般都是字符串,类似C语言中的宏定义,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上

4、文件指示:

  • 在一个Makefile中引用另一个Makefile
  • 根据某些情指定Makefile中的有效部分
  • 定义一个多行的命令

5、注释:Makefile中只有行注释,其注释是用"#"字符,如果在Makefile中使用"#"字符,可以用反斜框进行转义

在Makefile中的命令,必须要以[Tab]键开始

二、 Makefile的文件名

默认情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、"makefile"、"Makefile"

推荐使用Makefile

当然支持使用别的文件名,使用的时候需要指定file参数

[root@typhoeus79 makefile]# make -f aMakefile
gcc -c -o test.o test.c
gcc -c -o printInt.o printInt.c
gcc -c -o printWord.o printWord.c
gcc -o test test.o printInt.o printWord.o
[root@typhoeus79 makefile]# make --file aMakefile clean
rm -rf test.o printInt.o printWord.o test

三、引用其它的Makefile

在Makefile使用include关键字可以把别的Makefile包含进来

[root@typhoeus79 makefile]# more Makefile
OBJS = test.o printWord.o printInt.o
CC = gcc test: $(OBJS)
$(CC) -o test $(OBJS) #include
include printIntMakefile test.o:printWord.h .PHONY: clean
clean:
rm -rf $(OBJS) test
[root@typhoeus79 makefile]# more printIntMakefile
printInt.o: printInt.h
[root@typhoeus79 makefile]# make
gcc -c -o test.o test.c
gcc -c -o printWord.o printWord.c
gcc -c -o printInt.o printInt.c
gcc -o test test.o printWord.o printInt.o
[root@typhoeus79 makefile]# make clean
rm -rf test.o printWord.o printInt.o test

make会在当前目录下首先查找,如果没有找到,会如下几个目录中寻找:

1、"-I"或者"--include-dir"参数,make就会在这个参数所指定的目录下寻找

2、如果目录<prefix>/include(一般是:/usr/lcoal/bin或者/usr/include)存在的话,make也会去找。

如果都没有找到的话,make会生成一条警告信息,但不会马上出现致命错误。

-include <filename>
无论include过程中出现什么错误,都不要报错继续执行

四、环境变量MAKEFILES

如果当前环境中定义环境变量MAKEFILES,make会把这个变量中的值作为一个类似于include的动作。

建议不要使用这个环境变量,一旦被定义,所有makefile都会受影响

五、make的工作方式

make工作的执行步骤如下:

  1. 读入所有的Makefile
  2. 读入被include的其他Makefile
  3. 初始化文件中的变量
  4. 推动隐晦规则,并分析所有规则
  5. 为所有的目标文件创建依赖关系链
  6. 根据依赖关系,决定哪些目标要重新生成
  7. 执行生成命令

1-5为第一阶段,6-7为第二阶段。

第一个阶段中,如果定义的变量被使用了,make会把其展开在使用的位置,但make并不会完全马上展开,make使用的是拖延战术

如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用,变量才会在其内部展开。

书写规则


规则包含两个部分,一个是依赖关系,一个是生成目标的方法

Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的。

一、规则举例

printInt.o: printInt.c printInt.h
gcc -c -g printInt.c

printInt.o是目标,printInt.c和printInt.h是目标所依赖的源文件,只有一个命令“gcc -c -g printInt.c”(以Tab键开头)

这条规则告诉两件事:

1、文件的依赖关系,如果printInt.c和printInt.h的mtime比printInt.o新的话,或者printInt.o不存在,那么依赖关系发生

2、如何生成目标文件

 二、规则的语法

targets : prerequisties
command 或者 targets : prerequisties;command
command

targets是文件名,以空格分开,可以使用通配符。

如果命令太长,可以使用反斜杠作为换行符。

三、在规则中使用通配符

Makefile持续学习二的更多相关文章

  1. Makefile学习二

    今天继续对Makefile进行研究,话不多说,进入正题: make常用内嵌函数: 下面利用上面的知识点来实现一个多级目录的Makefile,如下: 多级目录Makefile: 这个例子的目录结构如下: ...

  2. 运用Autoconf和Automake生成Makefile的学习之路

    作为Linux下的程序开发人员,大家一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的M ...

  3. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  5. Makefile的学习笔记

    Makefile的学习笔记 标签: makefilewildcard扩展includeshellfile 2012-01-03 00:07 9586人阅读 评论(2) 收藏 举报  分类: Linux ...

  6. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  7. TweenMax动画库学习(二)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  8. Hbase深入学习(二) 安装hbase

    Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ...

  9. Struts2框架学习(二) Action

    Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...

随机推荐

  1. 媲美jQuery的JS框架——AngularJS(一)

    前言 相信原生JS大家都不陌生,至于为什么说原生,是因为在JS的基础上衍生出了很多的框架.有些框架的使用非常广泛,甚至已经达到了媲美原生的地步.在之前的文章中给大家介绍了jQuery这一介绍框架.今天 ...

  2. invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF

    数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束 ...

  3. OpenSCAD 建模:相框

    下载地址:https://github.com/ZhangGaoxing/openscad-models/tree/master/PhotoFrame 代码: module bottom(){ dif ...

  4. WPF 只允许打开一个实例

    我们有时候只希望我们的程序只打开一个实例,也就是我们的软件只有一次被打开. 那么我们可以通过一个办法知道,在这个软件打开前是不是打开过一个,还没关闭.也就是是否存在另一个程序在运行. 下面是一个简单方 ...

  5. 不使用数据结构反转栈 递归 CVTE实习 CVTE是一家什么公司

    本文因为垃圾csdn标题字限制,标题写不好.本文想说一个算法,和我在CVTE的实习,我看到CVTE是一家什么公司.如果想要喷我的,可以留言,我不会理.如果想喷公司,可以在博客评论或发到我邮件linde ...

  6. win10 uwp BadgeLogo 颜色

    本文讲的是在上传应用商店出现BadgeLogo颜色问题,和如何解决,因为我是渣渣,本文可能带有一定的主观性和局限性,说的东西可能不对或者不符合每个人的预期.如果觉得我有讲的不对的,就多多包含,或者直接 ...

  7. js 查询 添加 删除 练习

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. struts2国际化相关问题

    国际化资源文件的方式: Action范围的 包范围的 临时的 全局的(推荐) 一.配置全局的国际化资源文件 1.在类路径下,创建国际化资源文件 baseName.properties baseName ...

  9. 测试服务搭建之centos7下安装java

    一 安装Java 1 创建普通用户 useradd wujian passwd wujian 提示输入密码:[输入wujian的密码] user:wujian group:root passwd:12 ...

  10. 从入门到放弃之IO

    浅说IO 学到现在利用过的特殊符号不少组合起来很多都有让人眼前一亮的用法,在这里先聊聊I/O的一些相关知识. 本文开始之前先介绍一下需要知道的一些小知识和需要注意的地方. 在linux中也是有优先级的 ...