让你的makefile更专业。

在上一个Makefile所在目录下通过touch命令创建一个clean文件,执行make clean,将发现make总是提示clean文件是最新的,而不是按我们期望的那样对项目文件进行清楚操作。make这样的行为,是因为它将clean当做文件来处理,在当前目录下找到了clean文件,而且clean目标没有任何先决条件,所以当我们要求make构建clean目标时它会认为clean文件是最新的,从而拒绝我们真正的文件清除操作。出现这种情形,是因为我们对clean目标的定义与make所理解的有出入。目录文件名与makefile的目标名重名在现实项目中是难免的,假目标(phony target)概念的提出正是为了解决这种问题的。

假目标采用 .PHONY关键字来定义,注意必须是大写字母。运用假目标之后,更改makefile并运行如下:

1 .PHONY: clean
2 app:main.o foo.o
3     gcc -o app main.o foo.o
4 main.o:main.c
5     gcc -o main.o -c main.c
6 foo.o:foo.c
7     gcc -o foo.o -c foo.c
8 clean:
9     rm -rf app main.o foo.o

采用.PHONY关键字声明一个目标之后,make并不会将其当做一个文件来处理。可以想象,由于假目标并不与文件关联,所以每次构建假目标时它所在规则中的命令一定会被执行。拿这里的clean目标做比方,即使多次执行make clean,make每次都会执行文件清楚操作。

运用变量提高可维护性:

编写专业的makefile离不开变量,通过使用变量可以使得makefile更具可维护性。

运用变量改写第一个makefiel。

 1 .PHONY: clean
 2
 3 CC = gcc
 4 RM = rm
 5
 6 EXE =simple
 7 OBJS =main.o foo.o
 8
 9 $(EXE): $(OBJ)
10     $(CC) -o $(EXE) $(OBJS)
11 main.o:main.c
12     $(CC) -o main.o -c main.c
13 foo.o:foo.c
14     $(CC) -o foo.o -c foo.c
15 clean:
16     $(RM) -rf $(EXE) $(OBJS)

定义变量时其值可以为空,即无右值。引用变量需要采用 $(变量名)或 ${变量名} 的形式。

引入变量之后,如果需要更改编译器,只需要更改赋值变量的地方,其实相当于C语言宏定义的作用,便于更改移植。

上面的makefile,存在目标名和先决条件名在规则中重复出现,如果目标名或先决条件发生了改变,那么得在相应的命令中跟着更改这个很麻烦,为了省去这种麻烦,我们借助于如下一些自动变量:

除了这三个自动变量外,在makefile中还可以使用其他的自动变量,后面需要使用到的时候再提及。目前simple项目用这三个变量就足够了。

用上面的变量测试上面的Makefile,再正式介绍之前,得先介绍另外一个知识点。

1 .PHONY: all
2 all:first second third
3     @echo "\$$@ = $@"
4     @echo "$$^ = $^"
5     @echo "$$< = $<"
6 first second third:

在Makefile中,dollar符(这个字符博客老抽风) 具有特殊的意思,如果采用echo输出dollar,则必须用两个连着的dollar;

对于bash shell 也有着特殊的意思,需要在  之前加一个反斜杠”\“。

最后一行是一个只有目标的规则,如果除去它会有什么问题呢?读者可以自己试试。

注释(makefile中用#表示注释,需要注释多行,在注释行的末尾加上反斜杠"\",下一行也会被注释)最后一行之后报错如上图。显示没有规则创建上述目标。因为all的先决条件决定了构建all目标之前必须先构建first ,而first如果不存在,报错也是应该的。

采用自动变量之后运行结果的Makefile如下所示:

 1 .PHONY: clean
 2
 3 CC = gcc
 4 RM = rm
 5
 6 EXE =simple
 7 OBJS =main.o foo.o
 8
 9 $(EXE): $(OBJS)
10     $(CC) -o $@ $^
11 main.o:main.c
12     $(CC) -o $@ -c $^
13 foo.o:foo.c
14     $(CC) -o $@ -c $^
15 clean:
16     $(RM) -rf $(EXE) $(OBJS)

转载于:https://www.cnblogs.com/yangguang-it/p/6628937.html

Makefile学习之路——2相关推荐

  1. Makefile学习之路——PHONY

    让你的makefile更专业. 在上一个Makefile所在目录下通过touch命令创建一个clean文件,执行make clean,将发现make总是提示clean文件是最新的,而不是按我们期望的那 ...

  2. Makefile学习笔记 - 我的CPP之路 - C++博客

    Makefile学习笔记 - 我的CPP之路 - C++博客 Makefile学习笔记 Makefile学习笔记 先列出一个很简单的Makefile例子: --------- hd.cpp #incl ...

  3. 一个程序员的Java和C++学习之路(整理)

    转载:http://blog.csdn.net/ajian005/article/details/8003655 Java学习之路 一直有这么个想法,列一下我个人认为在学习和使用Java过程中可以推荐 ...

  4. 【转】一个程序员的Java和C++学习之路(整理)

    经典编程书籍大全:  http://blog.jobbole.com/106093/  https://github.com/jobbole/awesome-programming-books Jav ...

  5. 一个程序员的Java和C++学习之路

    转载自:http://blog.csdn.net/ajian005/article/details/8003655 经典编程书籍大全: http://blog.jobbole.com/106093/ ...

  6. 嵌入式学习之路(二十)——数据结构(2)

    嵌入式学习之路(二十)--数据结构(2) 上次我们讲了排序的四个基本的算法,今天我们先来讲讲数据结构 一.什么是数据结构 是指相互之间具有一定联系的数据元素的集合. 元素之间的相互联系称为逻辑结构. ...

  7. Redis学习之路(一)--下载安装redis

    redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...

  8. 前端Vue学习之路(二)-Vue-router路由

    Vue学习之路 (二) Vue-router(基础版) 一.增加静态路由 二.动态路由+路由嵌套+404页面 三. 编程式导航 四.命名路由 五.命名视图 六.重定向和起别名 1.重定向 2.起别名 ...

  9. 前端Vue学习之路(一)-初识Vue

    Vue学习之路 (一) 1.引言 2.更换npm国内镜像源 3.用npm下载Vue 4.Vue全家桶 5.使用命令创建项目 5.推荐插件 6.推荐网站 7.学习扩展 1.引言 先安装node.js环境 ...

最新文章

  1. UESTC 1698 The Game
  2. 专访赵加雨:WebRTC在网易云信的落地
  3. 为什么说“按月订购”和“无人货架”本质上是一样的?
  4. 从4篇顶会论文看Self-training最新研究进展
  5. 运动基元_开发人员的新分布式基元
  6. C# JsonHelper类
  7. 局域网打印机反应慢_为什么你的Excel这么慢,这些原因必须要知道!
  8. 软考网络管理员学习笔记5之第五章广域网与接入网技术
  9. 当了几年面试官看了无数简历,你们可以认真写简历吗?
  10. 用阿里网盘有一段时间了,说说总体感受吧
  11. HIGEN海坚驱动器维修FDA7045伺服变频器维修
  12. 语音机器人空号识别介绍
  13. 英文学习20180529
  14. cad 打开硬件加速卡_加速,连续变向,你以为是在说体育运动吗?其实我是在说CAD技巧...
  15. 接码平台源码_你的票被服务器上的爬虫“吃”了,本文解析爬虫抢票的源码!...
  16. latex—中文目录乱码
  17. Kettle CSV文件与json文件转换实例
  18. Java web学习——Spring MVC项目实例,三层架构通过JDBC链接SQLServer2012
  19. Ubuntu20.04下没有亮度调节且找不到/sys/class/backlight文件夹(backlight里为空)的解决办法
  20. 【过关斩将7】面试谈薪资时,HR压价怎么办?

热门文章

  1. php access ole相片,[求助]怎样读取ACCESS数据库中的OLE对象的图片啊???
  2. jquery PHP 中文乱码,PHP输出中文乱码怎么解决?
  3. 2021年7月【RHCE考试战报】他们都在提升,你还在吃鸡王者吗?
  4. 当 Kubernetes 遇到机密计算,阿里巴巴如何保护容器内数据的安全?
  5. 深入解析阿里 PouchContainer 如何实现容器原地升级
  6. Java程序转成exe可执行程序方法和exe4_j下载地址和破解。
  7. android audiotrack权限,Android中AudioRecord和AudioTrack的使用注意
  8. 劫持 function_core.php,function_core.php文件中常用函数
  9. 如何维护关键字_SEO人如何制定工作计划?【大站】
  10. wireshark合并多个文件_小技巧:快速合并多个excel文件(收藏版)