1. Makefile的编写:
1>. makefile的命名
1. makefile
2. Makefile
2>. makefile中的规则
三部分:
目标(app):依赖(main.c a.c b.c)
命令(gcc main.c a.c b.c -o app)
  gcc main.c a.c b.c -o app

执行 make 命令, 就会按照makefile中编写的规则编译整个项目
在makefile文件中可以有一个或多个规则

第一版本:
   app:main.c sub.c mul.c add.c
   gcc main.c sub.c mul.c add.c -o app
缺点: 修改一个程序, 重新make其他文件也会被重新编译

改进:
第二个版本:
makefile工作时候的原理:
1. 如果规则中的依赖不存在, 向下查找下边的规则, 使用找到的规则生成不存在的依赖.
2. 通过时间判断是否更新:
第一次: add.c -> add.o
第二次: 修改add.c 如果目标的时间比依赖的时间早, 需要更新

直接make生成的是一个条规则中的目标(终极目标)
生成其他规则中的目标:
make 其他规则中的目标的名字
第二个版本程序:
   app:main.o sub.o mul.o add.o
   gcc main.o sub.o mul.o add.o -o app
   # 编写规则, 来生成依赖中不存在的文件
   main.o:main.c
   gcc -c main.c
   sub.o:sub.c
   gcc -c sub.c
   mul.o:mul.c
   gcc -c mul.c
   add.o:add.c
   gcc -c add.c
 
   hello:
   echo "hello makefile"
缺点: 代码冗余

第三版本:
变量: 自动变量: 自定变量只能在规则的命令中使用
$<: 依赖中的第一个
$^: 所有的依赖
$@: 规则中的目标
%.o:%.c
main.o:main.c
gcc -c main.c
gcc -c main.c -o main.o
大写: makefile中自带的变量:
CC == cc == gcc
CPPFLAGS = -I./

代码:
   # 自定义变量
   obj = main.o sub.o mul.o add.o
   app:$(obj)
   gcc $(obj) -o app
   # 编写规则, 来生成依赖中不存在的文件
   # 模式规则
   %.o:%.c
   gcc -c $< -o $@
缺点: .o还是需要手动指定, 适应能力不行

版本4:
使用函数: -- 在makefile里边, 所有的函数都是有返回值的
1. wildcard -- 搜索指定目录下,指定类型的文件
2. patsubst -- 匹配替换函数
代码:
  # 使用makefile中的函数
  src = $(wildcard ./*.c)
  obj = $(patsubst %.c, %.o, $(src))
  app:$(obj)
  gcc $(obj) -o app
  # 编写规则, 来生成依赖中不存在的文件
  # 模式规则
  %.o:%.c
  gcc -c $< -o $@
缺点: 没有清除项目的功能

版本5:
声明伪目标: 不对文件做是否更新的判断
.PHONY:目标名

  # 使用makefile中的函数

  target = app
  src = $(wildcard ./*.c)
  obj = $(patsubst %.c, %.o, $(src))
  app:$(obj)
  gcc $(obj) -o app
  # 编写规则, 来生成依赖中不存在的文件
  # 模式规则
  %.o:%.c
  gcc -c $< -o $@

  #伪目标

  .PHONY:clean

  clean:

    -rm -f $(obj) $(target)

  

Makefile相关知识的更多相关文章

  1. Makefile 基本知识

    Technorati 标签: Makefile 基本知识   最常见的书写方式: CC = gcc LD = ld STRIP = strip CFLAGS := -Os -static -DEZ_O ...

  2. 5、Makefile基础知识汇总(转自陈皓总述)

    一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  5. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  6. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  7. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  8. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  9. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

随机推荐

  1. z-index

    1.定位对象能够遮盖非定位对象,除非定位对象的z-index值为负数. 2.同层级定位对象z-index大的能够覆盖z-index值小的. 2.1  同层级的子集相互比较要先看父集(即同层级)的大小; ...

  2. MATLAB绘图

    matlab绘制散点图 clc,clear x=[11.9,11.5,14.5,15.2,15.9,16.3,14.6,12.9,15.8,14.1]; y=[196.84,196.84,197.14 ...

  3. 该字符串未被识别为有效的 DateTime

    开发语言C#,System.Data.SQLite.dll驱动. SQLserver数据库转换为SQLite数据库时,日期类型默认转为DATETIME. 执行查询SQL语句,数据为空(查询不到数据时) ...

  4. js'中的apply和call和bind的用法

    apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数obj:这个对象将代替Function类里this对象args:这 ...

  5. [原] MSSQL MDF文件太大问题

    USE 你的库名; GO -- 数据库空间使用情况 EXEC sp_spaceused; -- 查下文件空间使用情况 SELECT file_id, name, [文件大小(MB)] = size / ...

  6. 使用bat/vbs/ahk对Windows下进行自动化操作

    回想90年代,我们在DOS下使用各种命令链对操作进行简化和自动化,如DOS 5.0添加的DosKey,利用管道和重定向对多组命令进行链式操作.后来使用了Ubuntu和其它Linux发型版后,bash下 ...

  7. VIM配置与管理

    VIM是写代码的神器,个人觉得比sublime更强,详情http://zh.wikipedia.org/wiki/Vim.如果用网游做类比,没有经过打造的VIM,也只能算是一只非常有潜力的0级宠物,经 ...

  8. JQUERY PLUGIN:BARCODE条形码插件

    1)query.barcode.js安装 同其他jquery插件一样,只需要将jquery框架和jquery.barcode.js导入页面即可. <script type="text/ ...

  9. Android EditText中插入话题模块的删除处理方法

    在 EditText 中添加话题 或者是 @某人 时 看起来挺简单,实际操作会有很多坑爹的问题 private String mTopic: //光标保持在话题的末尾 mInputEdit.setOn ...

  10. kafka0.9.0及0.10.0配置属性

    问题导读1.borker包含哪些属性?2.Producer包含哪些属性?3.Consumer如何配置?borker(0.9.0及0.10.0)配置Kafka日志本身是由多个日志段组成(log segm ...