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. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  2. c#使用GDI+简单绘图(二)

    // Create the in-memory bitmap where you will draw the image. // This bitmap is 300 pixels wide and ...

  3. 关于width与padding

    http://blog.csdn.net/yaoyuan_difang/article/details/24735529

  4. 笨鸟先飞之ASP.NET MVC系列之过滤器(03动作过滤器过滤器)

    概念介绍 动作过滤器应该是我们平常工作中需要用到最多的过滤器了,动作过滤器,主要在我们的动作方法执行前后执行. 如果我们需要创建动作过滤器需要实现IActionFilter接口. 我们看到该接口里有两 ...

  5. Charle抓包与wireshark使用

    今天就来看一下Mac上如何进行抓包,之前有一篇文章介绍了使用Fidder进行抓包 http://blog.csdn.net/jiangwei0910410003/article/details/198 ...

  6. 【转载】jQuery动画中的queue()函数

    原文链接:http://www.cnblogs.com/hh54188/archive/2011/04/09/1996469.html 原文摘要:当你使用一系列的动画效果(如hide,show),这些 ...

  7. VCI_CAN二次开发摘机

    1. 关于CAN滤波的设置的几个参数 PVCI_INIT_CONFIG结构,VCI_InitCAN函数调用时使用 AccCode: 验收码(左对齐) 帧过滤验收码.对经过屏蔽码过滤为"有关位 ...

  8. jfinal使用jstl表达的存在的问及解决

    问题 使用jstl 的el表达式 传递数据刷新页面,页面数据不显示,经过验证,数据的确传递过去,但是官方文档并没有详细描述,getModel() 不需要设get set() ,但是使用jstl el表 ...

  9. Java IO(IO流)-1

    IO流 第一部分 (outputStream/InputStream Writer/Redaer) IO流对象中输入和输出是相辅相成的,输出什么,就可以输入什么. IO的命名方式为前半部分能干什么,后 ...

  10. CSS3选择器在HTML5中的使用

    1,有CLASS属性的input标记 Input[class]{ } 2,class属性是sm的元素 Input[class='sm']{} 3,  凡是class=sm的元素 [class='sm' ...