Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1875980
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2018-10-15 22:16:10

前段时间一直在编译程序,看Makefile看得头疼,索性整理一下,以备后用,以后应该会不定期更新~
1. $@: 目标文件的名称
2. $^: 所有的依赖文件,以空格分开,不包含重复的依赖文件
3. $<: 第一个依赖文件的名称
4. $?: 构造所需文件列表中更新过的文件
4. Makefile中的函数定义被包裹在define和endef当中,如下:

点击(此处)折叠或打开

  1. define func
  2.     @echo "This is $(0)"
  3.     @echo "param 1 is $(1)"
  4.     @echo "param 2 is $(2)"
  5. endef

  
通常,调用自定义的方法是在规则中,使用$(call )方式进行调用
6. notdir: 去除所有的目录信息
7. patsubst:替代的意思

点击(此处)折叠或打开

  1. OBJ = $(patsubst %.c %.o $(SRC))


在SRC中找到所有.c文件,之后将它们全部替换成.o
8. wildcard: 

点击(此处)折叠或打开

  1. $(wildcard *.c)


获取当前目录下所有.c文件
9. strip:去掉字符串中多余的空格

点击(此处)折叠或打开

  1. STR = a b c
  2. LOSTR = $(strip $(STR))


结果输出为:a b c
10. ifneq:判断两个参数是否相同

点击(此处)折叠或打开

  1. ifneq($(A),$(B))


若有一个参数为空,则判断另一个参数是否为空
11. filter和filter-out:过滤函数和范过滤函数

点击(此处)折叠或打开

  1. #filter 返回匹配PATTERN的TEXT
  2. $(filter PATTERN, TEXT)
  3. #filter-out 返回没有匹配PATTERN的TEXT
  4. $(filter-out PATTERN, TEXT)


12. foreach:循环

点击(此处)折叠或打开

  1. $(foreach <var>, <list>, <text>)


取出list当中的每一个变量,放到var中,再执行text当中的命令,整体返回结果以空格分割
13. info, warning, error: 显示对应信息

点击(此处)折叠或打开

  1. $(info text)
  2. $(warning text)
  3. $(error text)


14. eval: 将eval后的命令的结果展开到Makefile当中,执行make命令

点击(此处)折叠或打开

  1. define func
  2.     v = 123
  3. endef
  4. $(eval $(call func))


若没有eval命令,则变量v在外部不可见,若加了eval命令,则v在外部可见
15. %和\*区别:%为Makefile规则通配符,一般用于规则描述;\*则不具备该功能,
16. if:

点击(此处)折叠或打开

  1. $(if <CONDITION>, THEN-PART[,ELSE-PART])


17. VPATH和vpath:  
VPATH: 其本身是变量。为make时额外需要添加的目录,只对make命令起作用,不对gcc等编译命令起作用,两个目录之间用冒号':'间隔;

点击(此处)折叠或打开

  1. VPATH = src : include


vpath: 其本身不是变量,是一个make的关键字

点击(此处)折叠或打开

  1. #为符合模式pattern的文件指定搜索目录dirs
  2. vpath <pattern> <dirs>
  3. #清除符合模式pattern的文件的搜索目录
  4. vpath <pattern>
  5. #清除所有已经被设置好了的文件搜索目录
  6. vpath


18. sort:排序

点击(此处)折叠或打开

  1. $(sort bb cc aa)


19. $和$$的区别:$A是在Makefile当中找到变量A;$$(a)则是在规则语句中获取shell当中的变量A,规则语句之间要用";\\"连接相邻的行(各行共享变量)
20. @:如果将@添加到命令行前,这个命令将不被make回显出来

点击(此处)折叠或打开

  1. #输出--compiling
  2. @echo --compiling
  3. #输出echo --compiling
  4. echo --compiling


21. -:通常用于忽略删除不存在文件,或创建已经存在的文件(夹)这类错误

点击(此处)折叠或打开

  1. -rm file
  2. -mkdir dir


有道云笔记连接:
阅读(2544) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~