基本规则

目标:依赖

(tab)规则

目标:需要生成的目标文件

依赖:生成该目标所需的一些文件

规则:由依赖文件生成目标文件的手段

tab:每条规则前必须以tab开头,使用空格不行。

例如:

/**
test.c
**/
#include<stdio.h>
int main()
{
printf(“this is test\n”);
return ;
}

终端编译就是:gcc test.c -o test

换成Makefile文件就是

test:test.c
gcc test.c -o test

其中第一行的test就是要生成的目标,test.c 就是依赖项,第二项就是由test.c生成的test的规则。

Makefile可以生成多个目标,但是Makefile会将第一个目标定为终极目标。

普通变量:

变量定义以及赋值:

变量直接采用赋值的方法即可完成定义;如:

INCLUDE = ./include/

变量取值:

用括号括起来再加一个美元符,如:

FOO = $(OBJ)

系统自带变量:

通常都是大写,比如CC,PWD,CFLAG,等等。

有些有默认值,有些则没有,比如:

CPPFLAGS:预处理器需要的选项 如:-I

CFLAGS:编译的时候使用参数 -Wall -g -c

LDFLAGS:链接库使用的选项 -L -I

变量的默认值可以被修改,比如CC的默认值是cc,但是可以修改为CC = gcc

自动变量:

常用的自动变量:

系统提供了很多自动变量,但常用的就是与以下三个,这些自动变量只能在规则中使用,其他地方不能使用。

$@ à规则中的目标

$< à规则中的第一个依赖项

$^ à规则中所有的依赖性

例如:

app:main.c fun1.c fun2.c
gcc $^ -o $@

其中:$^表示main.c fun1.c fun2.c,$< 表示main.c , $@ 表示app

模式规则:

模式规则是在目标及依赖条件中使用%来匹配对应的文件,比如在目录下有main.c,fun1.c,fun2.c 三个文件,对这三个文件的编译可以由一条规则完成。

%.o : %.c
$(CC) -c $< -o $@

这条模式规则表示:

main.o 由main.c 生成

fun1.o 由fun1.c 生成

fun2.o 由fun2.c 生成

这就是模式规则的作用,可以一次匹配目录下所有的文件。

函数:

makefile也为我们提供了大量的函数,同样经常使用到的函数为以下两个。

wildcard:

用于查找指定目录下指定类型的文件,跟的参数就是目录+文件类型,比如:

src = $(wildcard ./src/*.c)

这句话表示,找到./src目录下的所有文件后缀为.c的文件,并赋值给变量src

命令执行完毕后,src的值就是main.c fun1.c fun2.c

patsubst

匹配替换,例如以下例子,用于从src目录中找到所有的.c结尾的文件,并将其替换为.o文件,并赋值给obj

obj = $(patsubst %.c , %.o ,$(src))

将src变量中所有后缀为.c文件替换成.o

命令执行完成后,obj的值为main.o fun1.o fun2.o

特别的,如果想把.o文件放在obj目录下,可以用以下方法:

ob = $(patsubst ./src/%.c, ./obj/%.o, $(src))

makefile文件中所有的函数都必须有返回值。

#make all 执行生成可执行文件
#1编译器 2编译选项 3输出 4生成的可执行文件 5需要的源文件 6需要当库文件

Make文件(一)的更多相关文章

  1. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  2. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  3. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  4. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  5. SQLSERVER将一个文件组的数据移动到另一个文件组

    SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...

  6. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  7. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  8. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  10. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

随机推荐

  1. POJ - 3469 Dual Core CPU (最小割)

    (点击此处查看原题) 题意介绍 在一个由核A和核B组成的双核CPU上执行N个任务,任务i在核A上执行,花费Ai,在核B上执行,花费为Bi,而某两个任务之间可能需要进数据交互,如果两个任务在同一个核上执 ...

  2. # vmware异常关机后,虚拟系统无法启动的解决办法

    vmware异常关机后,虚拟系统无法启动的解决办法 先使用everything搜索所有后缀为.lck的文件,这些文件全部删除,如果不确定是否可以删除,先把这些文件转移到桌面,等能启动虚拟系统之后再删除 ...

  3. 使用Redis實現秒殺功能

    <?php $id = 1; $pdo=new PDO("mysql:host=127.0.0.1;dbname=test","root","r ...

  4. 房地产大佬潘石屹推荐学Python编程,这本从0到1就够了

    潘石屹推荐学Python编程,很多人都不相信,他的微博真真切切. 连房地产都开始学Python了,因为要听懂机器,让机器为我所用. 再不学习Python真的晚了!!!! 如何学? 怎么学? 还是推荐高 ...

  5. Codeforces 1190B. Tokitsukaze, CSL and Stone Game

    传送门 不妨把每一堆按照石头数量从小到大排序 注意到每次只能拿一个石头,那么不论何时每堆石头的排名都是一样的 那么最终所有堆的状态一定就是 $0,1,2,...,n-1$,现在每一堆最终的石头数量都确 ...

  6. Leetcode简单题

    # Title Solution Acceptance Difficulty Frequency     1 Two Sum       44.5% Easy     2 Add Two Number ...

  7. JavaScript冒泡排序法实现排序操作

    var arr = [10,8,6,9,1,7,1,13,5,1,9]; //冒泡排序 function bubbleSort(tmpArr){ for(var i = tmpArr.length-1 ...

  8. Vue中如何插入m3u8格式视频,3分钟学会!

    ​        大家都知道video只支持ogg.webm.MP4格式,但是要是m3u8格式的视频怎么办?最近遇到这个问题在网上找了好多办法都不行,最后找到video.js后才完美解决,所以决定写一 ...

  9. js 发送异步请求

    js用XMLHttpRequest发送异步请求 发送GET请求 var xhr = new XMLHttpRequest(); xhr.open('GET',url);//url为请求地址 xhr.r ...

  10. springboot(2)-阶段篇

    web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters.property.log等 json 接口开发 在以前的spring 开发的时候需要我们提供jso ...