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)

  

最新文章

  1. 使用串口线真机调试Linux内核
  2. 【swift学习笔记】五.使用枚举优雅的管理Segue
  3. &amp;#65279; 非法字符 原因 以及解决办法
  4. 去掉UItableview headerview黏性(sticky)
  5. iOS开发--开发者帐号
  6. 【转】使用 Auto Layout 的典型痛点和技巧
  7. javascript三种创建对象的方式
  8. 【转】java 解析 plist文件
  9. 在打包程序中自动安装SQL Server数据库 .
  10. windows下使用命令查看端口占用情况
  11. mysql新手入门随笔3
  12. Ubuntu14.04 安装MySQL 及Can‘t connect to local MYSQL server through socket ’/var/run/mysqld/mysqld.sock‘ (2)
  13. AndroidStudio下加入百度地图的使用 (三)——API基本方法及常量属性
  14. [UI] 06 - jQuery
  15. Xampp单独升级某个软件
  16. jenkins部署java项目,脚本文件放在远程仓库中 和jar一起打包(六)
  17. Numpy:索引与切片
  18. flex布局时,内容区域自适应高度
  19. POJ P2777 Count Color——线段树状态压缩
  20. Netty系列之一开始使用

热门文章

  1. Markdown 是什么
  2. jffs2和yaffs2文件系统制作工具的编译与使用
  3. 关于成为Java高级工程师之路
  4. 一个python的计算熵(entropy)的函数
  5. dll 日志文件 放在同一个目录。
  6. C#调用WebService (转)
  7. Asp.net MVC+Bootstrap3的悬浮式登录框效果
  8. java多线程 生产者消费者模式
  9. Python GUI 背景色与语法高亮主题配置
  10. Raytracer