Makefile里有什么?

Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

  1. 显式规则。显式规则说明了,如何生成一个或多个目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
  2. 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较简略地书写Makefile,这是由make所支持的。
  3. 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
  4. 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
  5. 注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜杠进行转义,如:“\#”。

最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。

make的工作方式

GNU的make工作时的执行步骤如下:

  1. 读入所有的Makefile。
  2. 读入被include的其它Makefile。
  3. 初始化文件中的变量。
  4. 推导隐晦规则,并分析所有规则。
  5. 为所有的目标文件创建依赖关系链。
  6. 根据依赖关系,决定哪些目标要重新生成。
  7. 执行生成命令。

1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。

Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.

3种格式的shell命令区别如下:

  • 不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行
  • 前缀 @   :: 只输出命令执行的结果, 出错的话停止执行
  • 前缀 -   :: 命令执行有错的话, 忽略错误, 继续执行

例子第一篇:

OBJS = ./persion.o#OBJS是生成目标文件的依赖
all : persion@echo "version 03"
persion : $(OBJS)g++ -o $@ $^#根据依赖生成目标文件persion;$(OBJS)的作用是取出变量值;变量$@指代目标文件;变量$^指代所有依赖文件;$<指代第一个依赖文件
./%.o : ./%.cppg++ -o $@ -c $^
#利用通配规则生成.o文件

#伪目标clean和install
.PHONY : clean
.PHONY : install
clean:rm -rf ./persion ./*.o
install:tar -zcvf persion.tar.gz ./persion@echo "make tar sucess"

第二篇:

srcs = $(wildcard ./src/*.cpp)#取srcs目录下所有.cpp文件
objs = $(patsubst %.cpp,%.o,$(srcs))
#将srcs中的所有.cpp文件替换为.o文件all:./obj/hello_world./obj/hello_world:$(objs)g++ $^ -o $@$(objs):%.o : %.cppg++ -c $^ -o $@ -I ./incdo:@cp ./src/*.o ./obj@rm ./src/*.o
.PHONY : clean
clean:@rm -rf ./obj/*.o ./obj/hello_world

1、makefile里的函数

makefile里的函数使用,和取变量的值类似,是以一个‘$’开始,然后是一个括号里面是函数名和需要的参数列表,多个变量用逗号隔开,像这样

return = $(functionname  arg1,arg2,arg3...)。

可能这里的'$'更像是从某个地址取值类似的操作。

2、 wildcard

使用:SRC = $(wildcard *.c ./foo/*.c)

搜索当前目录及./foo/下所有以.c结尾的文件,生成一个以空格间隔的文件名列表,并赋值给SRC.当前目录文件只有文件名,子目录下的文件名包含路径信息,比如./foor/bar.c。

3、notdir

使用:SRC = $(notdir wildcard)

去除所有的目录信息,SRC里的文件名列表将只有文件名。

4、patsubst

使用:OBJ = $(patsubst %.c %.o $(SRC))

patsubst是patten substitude的缩写,匹配替代的意思。这句是在SRC中找到所有.c 结尾的文件,然后把所有的.c换成.o。

转载于:https://www.cnblogs.com/nanqiang/p/8394919.html

Makefile 的使用相关推荐

  1. 浅显易懂 Makefile 入门 (12)— Makefile 常见的错误信息

    1. 常见的错误信息 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 -.或者 make 使用 -k 选项执行时. make 执行过程的致命错误都带有前缀字符串 ***.错误信息 ...

  2. 浅显易懂 Makefile 入门 (10)— 嵌套执行 make、export 的使用

    1. 嵌套执行 make 在一个大的工程文件中,不同的文件按照功能被划分到不同的模块中,每个模块可能都会有自己的编译顺序和规则,如果在一个 Makefile 文件中描述所有模块的编译规则,就会很乱,执 ...

  3. 浅显易懂 Makefile 入门 (09)— include 文件包含、MAKECMDGOALS

    1. include文件包含 当 make 读取到 include 关键字的时候,会暂停读取当前的 Makefile,而是去读 include 包含的文件,读取结束后再继读取当前的 Makefile ...

  4. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  5. 浅显易懂 Makefile 入门 (07)— 其它函数(foreach 、if、call、origin )

    1. foreach 函数 foreach 函数定义如下: $(foreach <var>,<list>,<text>) 函数的功能是:把参数 <list&g ...

  6. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)

    编写 Makefile 的时候,很多情况下需要对文件名进行操作.例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等. 注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待. 1 ...

  7. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  8. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  9. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译

    1. 什么是 Makefile Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目.一旦写编写好 Makefile 文件,只需要一个 ma ...

  10. Android 的NDK的Makefile编写

    Android.mk 是google根据Linux GNU Makefile精简编译脚本.具体来说:这就是GNU Makefile的一小部分. 举一个简单例子: LOCAL_PATH := $(cal ...

最新文章

  1. 详解Apache下.htaccess文件常用配置
  2. a*算法的时间复杂度_从经典算法题看时间复杂度
  3. dba mysql命令_Mysql常用DBA命令
  4. php取月份函数,分享3个php获取日历的函数
  5. pysparkpython版本_pyspark修改python版本
  6. 软件工程概论———登录界面的设计
  7. asp.net 2.0常见问题技巧1
  8. 29muduo_net库源码分析(五)
  9. eclipse主题颜色的下载与设置
  10. Android 启动问题——黑屏 死机 解决方法
  11. 计算机网络四个阶段的主要特征,1计算机的四个发展阶段的主要特征
  12. 马小云:利用信息差赚钱的暴利创业项目 ,批量开店月入3万
  13. highcharts pie ajax,Basic Pie
  14. iOS开发bug消灭之:Your application has presented a UIAlertController of style ...
  15. 【 MATLAB 】gca 介绍(当前轴或图表)
  16. 如何下载OpenJDK安装版本
  17. 正版软件 Microsoft 365 家庭版 1用户 58
  18. CSS二(复合选择器)
  19. idea windows找不到文件chrome
  20. Linux使用uinput实现虚拟鼠标

热门文章

  1. springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好
  2. 2018.1.30-31 开始racket,避免mutation,lazy evaluation
  3. git获取特定的commit
  4. 手机客户端应用功能测试方法总结
  5. Webpack支持.vue文件的打包
  6. RHEL 6.5----haproxy实现负载均衡
  7. 小团队管理与大团队管理
  8. 如何禁止chrome浏览器的缓冲图片以及css等资源文件
  9. Ubuntu 12.04装五笔,同时又可以打拼音。
  10. leetCode----day01---- 从排序数组中删除重复项