1. 好处

一次编写,终身受益

2. 命名规则

  • makefile

  • Makefile

3. 三要素

  • 目标

  • 依赖

  • 规则命令

4. 第一版makefile

目标:依赖
tab键 规则命令

makefile:

5. 第二版makefile

第一版更改其中一个文件,所有源码都重新编译

5.1 改进

  • 可以考虑编译过程分解,先生成 .o 文件,然后使用 .o 文件变成结果

5.2 定义变量

Makefile隐含规则:默认处理第一个目标

5.3 函数

  • wildcard:可以进行 文件匹配

  • patsubst:内容的替换

# get all .c file
SrcFiles=$(wildcard *.c) # ObjFiles 定义目标文件
ObjFiles=main.o add.o minu.o mul.o # 目标文件用法
app.out:$(ObjFiles)
gcc -o app.out -I./include *.o main.o:main.c
gcc -c main.c -I ./include add.o:add.c
gcc -c add.c -I ./include minu.o:minu.c
gcc -c minu.c -I ./include mul.o:mul.c
gcc -c mul.c -I ./include test:
echo $(SrcFiles)

5.4 makefile变量

  • $@: 代表 目标

  • $^ :  代表全部 依赖

  • $< :  第一个依赖

  • $? :  第一个变化的依赖

# get all .c file
SrcFiles=$(wildcard *.c) # all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles)) # 目标文件用法
app.out:$(ObjFiles1)
gcc -o app.out -I./include $(ObjFiles1) %.o:%.c
gcc -c $< -I ./include
test:
echo $(SrcFiles)
echo $(ObjFiles1)

5.5 添加清理功能(@在规则前作用)

# get all .c file
SrcFiles=$(wildcard *.c) # all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles)) # 目标文件用法
app.out:$(ObjFiles1)
gcc -o app.out -I./include $(ObjFiles1) # 模式匹配规则, $@,$<这样的变量,只能在规则中出现
%.o:%.c
gcc -c $< -I ./include -o $@ test:
echo $(SrcFiles)
echo $(ObjFiles1) # 添加清理功能
clean:
@rm -f *.o # 加 @表示指令不输出
rm -f app.out

5.6 “-”的作用

该条规则报错,仍然继续执行

5.7 防止有歧义, 定义伪目标

.PHONY:clean   # clean是一个伪目标,不是真正要得到的目标

5.8 总结

# get all .c file
SrcFiles=$(wildcard *.c) # all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles)) all:app.out # 目标文件用法 $@: 目标;$<: 依赖
app.out:$(ObjFiles1)
gcc -o $@ -I./include $(ObjFiles1) app.out1:$(ObjFiles1)
gcc -o $@ -I./include $(ObjFuiles1) # 模式匹配规则, $@,$<这样的变量,只能在规则中出现
%.o:%.c
gcc -c $< -I ./include -o $@ test:
echo $(SrcFiles)
echo $(ObjFiles1) # 定义伪目标,防止有歧义
.PHONY:clean # 添加清理功能
clean:
-@rm -f *.o # 加 @表示指令不输出
rm -f app.out

make  -f   xxx:指定文件

Linux命令(十三)make_makefile基础的更多相关文章

  1. Linux就该这样学--之常用linux命令及bash基础

    Linux就该这样学--之常用linux命令及bash基础 Linux命令 管道 重定向 环境变量 常用命令 常用系统工作命令 系统状态检测命令 工作目录切换命令 文本文件编辑命令 文件目录管理命令 ...

  2. linux命令格式及基础命令(一)

    linux命令格式 ~]#COMMAND [选项] [参数] 例如: ~]#ls 不带任何选项和参数 ``` stylus ~]#ls -lh /etc 列出/etc下所有文件和目录,同时要求以格式和 ...

  3. Linux命令补充及基础优化。

    1.用户部分 1.1 创建新用户 涉及命令 useradd [root@oldboyedu-50 ~]# useradd oldboy #添加用户 oldboy 1.2 设置密码 [root@oldb ...

  4. Linux命令之Nano基础指南

    Nano基础指南 1.  Nano基础 目的 这是篇nano简明使用指南,帮助你快速了解nano的基本用法.如想获取更多的帮助信息,请参阅: http://www.nano-editor.org 打开 ...

  5. 嵌入式开发应该掌握的一些Linux命令

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...

  6. 03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-其他基础命令

    03_Linux基础-文件类型-主辅提示符-第1提示符-Linux命令-内外部命令-快捷键-改为英文编码-3个时间-stat-{1..100}-du-cd-cp-file-mv-echo-id-she ...

  7. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  8. Linux命令工具基础04 磁盘管理

    Linux命令工具基础04 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩: 查看磁盘空间 查看磁盘空间利用大小 df -h -h: huma ...

  9. 罗列Linux发行版的基础目录名称,命令法则和功能

    罗列Linux发行版的基础目录名称命名法则及功用规定 目录描述 /主层次 的根,也是整个文件系统层次结构的根目录 /bin存放在单用户模式可用的必要命令二进制文件,所有用户都可用,如 cat.ls.c ...

  10. SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作

    摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...

随机推荐

  1. 【XSY1591】卡片游戏 DP

    题目描述 有标有数字为\(1\)~\(9\)的卡片各\(a_1,a_2\cdots a_9\)张,还有标有乘号的卡片\(m\)张.从中取出\(n\)张按任意顺序排列,取出两个乘号相邻和乘法在边界上的非 ...

  2. CODEFORCES掉RATING记 #4

    比赛:Codeforces Round #427 (Div. 2) 时间:2017.7.31晚 开场发现有6道题,都是水题(可能我只会做水题) A:比较\(2t_1+sv_1\)与\(2t_2+sv_ ...

  3. 安装 xadmin 报错: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Python\AppData\Local\Temp\pip-install-1k1byg0p\xadmin\

    报错详情 安装 xadmin 组件的时候报错 不论是命令行还是 pycharm 方式都不行 分析报错 按照报错提示是说 README.rst 文件的编码问题导致. 解决报错 通过 github 下载源 ...

  4. IntelliJ IDEA快捷键总结

    原文: IntelliJ IDEA快捷键 下面只列出Windows系统下的快捷键,Mac下的快捷键参考上面的链接. Remember these Shortcuts 功能 快捷键 Smart code ...

  5. 【WC2018】通道(边分治,虚树,动态规划)

    [WC2018]通道(边分治,虚树,动态规划) 题面 UOJ 洛谷 题解 既然是三棵树,那么显然就是找点什么东西来套个三层. 一棵树怎么做?入门dp. 两棵树?假设在第一棵树中的深度为\(dep\). ...

  6. linux rpm安装 failed depenencie(失败的依赖关系)错误原因

    rpm安装nfs 出现failed depenencie 经查资料得知命令后加上--nodeps --force,就可以了 加上那两个参数的意义就在于,安装时不再分析包之间的依赖关系而直接安装,也就不 ...

  7. IT项目管理——《人月神话》读后感

    这也许是和候红老师的最后的几节课了吧,侯老师是一个很有思想深度,很关心同学的好老师. 一开学就布置了阅读<人月神话>的作业,说实话,我没有看,以我的速度可能2.3个小时就看完了,但是我觉得 ...

  8. VSCode and NoteBook for JavaScript | NodeJS

    VSCode调试HTML环境配置 | Jupyter NoteBook IJavaScript 配置 VSCode调试HTML环境配置 先安装两个插件:Debugger for Chrome(调试) ...

  9. Linux安装Gitlab,附iSCSI分区挂载说明

    因为Gitlab数据要存放在共享存储,所以本次配置的重头戏倒变成了挂载ISCSI了. OS:CentOS 7.2IP:172.16.1.191/192.168.2.191 iSCSI分Target(服 ...

  10. bzoj2553 禁忌

    题目链接 题意 给出一个\(n\)个字符串的字典.对于一个字符串,他的贡献是这个字符串中最多的在字典中出现的不重叠子串的数量. 然后问一个长度为\(len\)的,字符集为前\(alphabet\)个字 ...