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. hibernate中各个jar包的含义和关系

    最基本的Hibernate3.3.2之 JAR包(必要): 包名 位置 用途 hibernate3.jar /hibernate 核心JAR包 antlr.jar /hibernate/lib/req ...

  2. Sql Server合并多行询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数

    示例表 tb 数据如下 id value ----- 1 aa 1 bb 2 aaa 2 bbb 2 ccc SELECT id, [val] = ( SELECT [value] + ',' FRO ...

  3. Silverlight:telerik RadControls for Silverlight 主题使用心得

    默认情况下: telerik RadControls控件使用的是Office Black 主题,就算在App.xaml.cs里写上 StyleManager.ApplicationTheme = ne ...

  4. redis的sentinel主从切换(failover)与Jedis线程池自动重连

    本文介绍如何通过sentinel监控redis主从集群,并通过jedis自动切换ip和端口. 1.配置redis主从实例 10.93.21.21:6379 10.93.21.21:6389 10.93 ...

  5. pseudocode of zigzag conversion

    1.Title : The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...

  6. 【特效】几种实用的按钮hover效果

    效果预览:http://www.gbtags.com/gb/rtreplayerpreview-standalone/3095.htm html: <ul class="btn&quo ...

  7. Java IO流 思维导图

  8. 【转】ATA Secure Erase

    ATA Secure Erase     This procedure describes how to use the hdparm command to issue a Secure Erase  ...

  9. Java跨域问题的处理详解

    1,JavaScript由于安全性方面的考虑,不允许页面跨域调用其他页面的对象,那么问题来了,什么是跨域问题? 答:这是由于浏览器同源策略的限制,现在所有支持JavaScript的浏览器都使用了这个策 ...

  10. 使用clone

    1.继承Cloneable接口 2.重写clone方法 3.在clone方法中调用super.clone() 4.把浅复制的引用指向原型对象新的克隆体