Makefile文件语法规则及用法总结
一、Makefile的作用
Makefile文件实质上就是一个工程代码编译脚本,一旦写好,只需要一个make命令,整个工程就会自动按照脚本的规定方式编译,极大的提高了软件开发的效率。
make是系统指令,它是根据自己的配置文件,可以进行工程管理的指令。文件放在目录,要编译哪个目录的文件,要链接哪个目录的文件....
makefile是make指令对应的一个配置,当输入make回车时,执行makefile里面的所有配置指令,一一执行。
makefile的组成:makefile的语法+shell指令。(任何linux里面用到的shell指令都可以加入进去)
二、make 命令使用
三、makefile的编写规则
基本语法如下:
目标文件:依赖文件
(tab)执行指令集合
工作原理:(修改时间比较的原理)
1.识别目标文件,去找到他的依赖文件(如果找得到)
2.执行情况
(1)如果发现目标文件不存在,同时依赖文件存在,就会执行指令集合。
(2)如果发现目标文件已经存在了,同时依赖问价存在,make指令会自动去比较两者的修改时间
修改时间:依赖文件 > 目标文件,就会执行指令集合。
修改时间:依赖文件 <= 目标文件,就不会执行指令集合。同时会提示目标文件已经是最新的
注意点:makefile之后从第一个规则体的依赖文件去操作,只会操作出现的依赖文件.
最常用的规则:(多个.c生成一个可执行文件)
目标文件(最终目标):依赖文件(n个)
执行指令
目标文件(依赖文件(n个)):依赖文件
执行指令
四、伪指令
all 跟 make+目标文件
all表示最终目标,后来的依赖文件就可以写可执行文件,不需要写指令。
如果在all后面的依赖文件没有出现clean,但是你写了clean。那么makefile是不会自动执行clean,只有当单独输入make clean时,才会独立执行clean执行指令。
在许多Makefile中都可以看到.PHONY:xxx之类的语句,其含义就是定义xxx为伪目标,当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。
可近似的理解为编译可选项:等用户想操作的时候才执行,用户不操作,不会自动执行。
参考博客: https://www.cnblogs.com/samuelwnb/p/3895191.html
五、makefile中的变量
实际上变量只能存储字符串。
定义:变量名 = “字符串”
使用:$(变量名)
赋值方式:
直接对变量本身进行操作
= 递归展开赋值,当对一个变量进行操作时,如果这个变量后后面有变化,这个变量不会马上赋值,会一直找到最后一次变量,再进行赋值。
:= 就地展开赋值,当对一个变量进行操作,直接使用这个变量当前的值,而不受后面任何变量。
在变量的基础上加上东西
+= 对某个变量的值,进行追加
?= 如果变量没有初始化,则对其初始化
六、自动变量
所有自动变量,自己本身存在的特定的作用。
$* 不包含拓展名的目标文件名称。
$+ 所有的依赖文件名称,但是可能出现同名的。
$^ 所有的依赖文件名称,但是不会出现同名的。
$< 第一个依赖文件的名称。
$@ 目标文件的完整名称
$? 所有已经更新的依赖文件的名字。(比目标文件要新的依赖文件)
模式规则:(%),只要在文件中,出现%符号,那就代表是模式规则。等效于shell指令的*通配符。
自动根据目标文件,去配对对应的依赖文件。自动顺序的配对
七、makefile的函数
makefile内部是允许自定义函数/使用函数。
函数的用法:
$(函数名 函数参数列表)
wildcard:文件名展开函数。将所有用户想要找到的文件名给得到(用户想要得到的文件名可以通过通配符)。
用法:$(wildcard 可变参数列表)
返回值:已经找到的文件名列表,每个文件名都加上空格。
$(wildcard *.c)
patsubst:替换字符串输出。按照用户指定的替换方式,对相应的字符串进行替换。
用法:$(patsubst <form>,<to>,<text>)
test:要进行替换的原始数据,字符串123s1df32asf5 123%
根据form里面格式的定义,替换称为to里面的格式。
$(patsubst %.c,%.o,"1.c 2.c ")
八、通用Makefile框架,适用于一般中小型项目
TARGET := ../bin/main
CC := gccINCLUDE:= -I ../includeLIBS:= -lpthreadCSRCS := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(CSRCS))$(TARGET): $(OBJS) $(CC) $+ -o $@ $(LIBS)
%.o:%.c$(CC) -c -g $< -o $@ $(INCLUDE)clean:rm -rf $(OBJS) $(TARGET)#rm *.o
九、库依赖顺序
当一个工程链接的库较多时,很多时候因为库之间的依赖问题导致一直编译不过。此时要捋清库之间的依赖关系,然后按依赖顺序(越底层的库越往后放)链接即可。
顺序应该如下:
LIBS := -l(应用层lib) -l(基础lib) -l(系统lib)
查看库依赖关系的命令有为:
# readelf -d [库名]
# ldd [库名]
十、Makefile调用shell命令
Makefile脚本中,是可以直接调用shell命令的,并且在执行make时,能看到执行的shell语句。
在shell命令前添加:'@' 符号, 则可以不显示命令本身而只显示结果。
在shell命令前添加: '-' 符号,则运行该条shell命令失败时,不会中断Makefile脚本的后续执行。
Makefile文件语法规则及用法总结相关推荐
- Makefile文件编写规则
From: http://aviva.iteye.com/blog/807494 Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释. 1.显式规则――描述 ...
- Makefile文件的编写规则
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...
- C语言makefile文件
文章目录 一.makefile的编写 二.make命令 三.makefile文件中的变量 四.应用经验 五.课后作业 六.版权声明 在软件的工程中的源文件是很多的,其按照类型.功能.模块分别放在若干个 ...
- 基础知识(三)makefile文件编写初级篇
linux下进行c++开发,需要熟悉相关编译器的编译.链接命令.这边主要以实例讲解,如何在linux中,进行c++程序简单的编译链接运行. 一.单文件编译链接 这里先从最简单的单个文件编译链接为例.在 ...
- 编写Makefile文件
续GCC编译器 1.编写Makefile UNIX系统上很多软件包都是使用make程序和Makefile文件来实现自动编译的,make程序的目的就是自动确定一个软件包的哪些部分需要重新编译,并用特定的 ...
- 解析Makefile文件的构建规则
2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...
- C语言:gcc编译过程及make命令、makefile语法规则
gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...
- 2.Makefile文件中包含哪些规则?
想要书写一个完整的 Makefile文件,需要了解 Makefile 的相关的书写规则.我们已经知道了 Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行 ...
- 一文详解CMakeLists文件编写语法规则详解
作者丨zhanghm1995@blog 来源丨https://blog.csdn.net/zhanghm1995/article/details/80902807 编辑丨3D视觉工坊 基本语法规则 C ...
最新文章
- epoch如何设置_使用TFRecordDataset时如何设置epoch计数器?
- 亲爱的,别把上帝缩小了 ---- 读书笔记2
- 2、ACE-实用生活口语-介绍 Introductions
- 【思维导图】脑机音乐接口,高效检测用户的情绪状态
- pycharm管理多个工程
- c语言中的关于数学问题的编程,C语言中具有代表性几种数学问题编程技巧探索.doc...
- 1063 Set Similarity
- uva 120——Stacks of Flapjacks
- malloc动态分配数组以及指针数组大小
- opencv方框内图像保存_opencv 图像滤波(均值,方框,高斯,中值)
- ajax 上传文件实例,Ajax 之文件上传
- centos7设置分辨率
- 深入理解Symbol
- (2022)安卓和苹果应用注册上架概述
- 自然常数e的由来以及计算机为什么是二进制
- 解读BLM业务领先模型中的业务设计
- java时区ZoneId集
- owt webrtc 音频没有声音
- clover EFI bootloaderfor mac(10.12)官方版下载
- 修改本地Git用户名、密码
热门文章
- 暑期后端培训(sql语句及数据库连接)
- 在gym的BipedalWalker-v2环境里面训练了agent
- 论文笔记:Deeply-Learned Part-Aligned Representations for Person Re-Identification
- csp2015-12
- CSS Design: Going to Print
- 意味着你面试有戏的6大信号|智测优聘总结
- oracle表空间追加数据文件,oracle数据库表空间追加数据库文件方法
- iOS中关于苹果审核IPv6的问题
- 利用JVM在线调试工具排查线上问题(超实用)
- 计算机应用基础课程设计评语,计算机应用基础课程设计