make/makefile
干锅土鸡
这个作者很懒,什么都没留下…
展开
-
22.打造专业的编译环境(下)
原创 2021-07-24 03:15:23 · 134 阅读 · 0 评论 -
21.打造专业的编译环境(中)
证明嵌入shell for循环完全可行.PHONY : all compile link clean rebuildMODULES := common \ module \ main MKDIR := mkdirRM := rm -frCC := gccLFLAGS := DIR_PROJECT := $(realpath .)DIR_BUILD := buildDIR_BUILD_SUB := $...原创 2021-07-24 02:50:09 · 225 阅读 · 0 评论 -
20.打造专业的编译环境(上)
先使用模块下的makefile编译模块代码,build存储编译的结果原创 2021-07-24 01:39:33 · 196 阅读 · 0 评论 -
19.路径搜索的综合示例
好处:项目维护人员可以快速上手3 决定最后生成的目标文件放在哪里创建两个文件夹一个放.h文件,一个放.c文件CFLAGS := -I $(DIR_INC):告诉gcc去这个文件夹寻找头文件22、23行:告诉编译器去对应的文件夹去寻找.c、.h文件看上去这个makefile复用性很不错,...原创 2021-07-23 21:01:27 · 71 阅读 · 0 评论 -
18.make中的路径搜索(下)
创建文件夹做实验:make实验可以知道.c文件从src2中选择。make优先选择的是vpath选择的路径将src2中的.c文件改成.cpp,也就是实验src2中找不到.c文件make会怎么样?输出可以看出make选择了src1中的func.c。将src1中的.c文件也改成.cpp,此时make后,直接报错...原创 2021-07-23 06:35:46 · 145 阅读 · 0 评论 -
17.make中的路径搜索(上)
不会,不利于项目管理。原创 2021-07-23 03:46:45 · 134 阅读 · 0 评论 -
16.make的隐式规则(下)
.c.o:由.c文件得到.o文件,$@代表.o文件,$^代表.c文件$@代表和.c文件同名的文件,$^代表.c文件原创 2021-07-22 17:48:18 · 64 阅读 · 0 评论 -
15.make的隐式规则(上)
新命令覆盖旧命令没出错,得到了正确的结果make解释器在解释代码时,发现规则没有,那么就去标准库去找隐式规则。cc:C语言编译器标准库里相当于这样子的代码:原创 2021-07-21 14:21:37 · 51 阅读 · 0 评论 -
14.自动生成依赖关系(续)
原创 2021-07-20 18:49:21 · 55 阅读 · 0 评论 -
13.自动生成依赖关系(下)
上述代码存在一定问题,先生成了dep文件,再创建deps文件夹…顺序反了更改如下:第22行,依赖项先判断是否创建了文件夹,没有的话先创建文件夹。在目标前加上路径,生成的目标直接放进路径内。25行,filter起到过滤的作用,保留.c文件,其他都去掉。12行,addprefix:给DEPS加上前缀路径。但是main.dep创建了两次?如何解决?判断文件夹是否已经存在可以解决这个问题...原创 2021-07-20 17:36:17 · 55 阅读 · 0 评论 -
12. 自动生成依赖关系(中)
为什么会打印this is text.txt ,因为include text.txt没有text.txt这个文件,所以会去makefile中查找有没有text.txt这个规则,发现有,那么就执行规则。如果将9、10行注释掉,那么make时会报错!如果没有该文件,可以改写makefile直接创建文件(执行make会直接执行第一个规则,其他不管)简单设想:创建test文件见,进去test,创建子文件夹subtest执行后的结果:这显然不是我们期待的结果…解决方法:让命令在同一个进...原创 2021-07-20 01:07:34 · 58 阅读 · 1 评论 -
11.自动生成依赖关系(上)
: .h头文件被修改,但是可能make不会执行可以正常工作,但是存在一定问题创建这四个文件夹来实验:可以正常运行,接下来把func.h中的字符串改写一下,但是make后显示最新::依据规则,make只会对源文件检查是否最新将makefile进行如下改写:$<:第一个依赖,接下来make就没有问题了但是问题来了:如何解决?“|” 这个符号在make中是重定向的含义,sed会接管test,将test中的abc替换成xyz当然,sed也支持正则表达式:..原创 2021-07-19 14:20:50 · 54 阅读 · 0 评论 -
10. 变量与函数的综合示例
以上都是预定义的函数原创 2021-07-18 20:19:32 · 119 阅读 · 0 评论 -
9.函数定义及调用
0参数是函数名call的作用将实参替换到函数体中对应位置19行干了两件事情:1、替换参数。2、将多行变量@echo My name is func1替换到19行对比================================================================var3 var4 实际上都是系统函数调用,真正意义上的自定义函数调用在makefile是不存在的。...原创 2021-07-18 15:38:16 · 54 阅读 · 0 评论 -
8.条件判断语句
这里的ifeq前面不是(tab)而是空格,因为只有命令前面才是(tab)上述两例代码可以转换成以下一个代码:make解释器在makefile执行前无法得知var4没有值这样改的话,结果就不一样了...原创 2021-07-18 13:31:07 · 56 阅读 · 0 评论 -
7. 高级变量主题(下)
一、若makefile中变量与系统环境变量相同,则以makefile中为准若希望打印的就是系统环境变量,则可以如下操作:二、makefile2中的JAVA_HOME打印出来的居然是makefile中的java_homeJAVA_HOME在make时被改写了,传递到了其他makefilevar没有输出:1、因为var只具有文件作用域,不会传递到其他makefile中去。2、不是系统环境变量。改写如下:var变成临时变量,不会修改系统环境变量重新make:var可以输出了原创 2021-07-16 00:54:56 · 76 阅读 · 1 评论 -
6. 变量的高级主题(上)
1. 变量值的替换使用指定字符(串)替换变量值中的后缀字符(串)语法格式:$(var:a=b) 或 $(var:a=b)替换表达式中不能有任何的空格make中支持使用${ }对变量进行取值src := a.cc b.cc c.ccobj := $(src:cc=o)test :(tab)@echo “obj => $(obj)”2. 变量的模式替换使用%保留变量值中的指定字符,替换其他字符语法格式:$(var:a%b=x%y)或${var:a%b=x%y}替换表达式中原创 2021-05-04 20:27:57 · 85 阅读 · 0 评论 -
5. 预定义变量的使用
1. 自动变量与特殊变量1.1 自动变量$@:当前规则中触发命令被执行的目标$^:当前规则中的所有依赖$<:当前规则中的第一个依赖注意:“$”对于makefile有特殊含义,输出时需要加上一个“$”进行转义把之前的代码改进:好处:需要添加新的依赖的话,只用加一个依赖名字即可2.2 特殊变量$(MKAE):当前make解释器的文件名$(MAKECMDGOALS)命令行中指定的目标名(make的命令行参数)$(MAKEFILE_LIST)make所需要处理的make原创 2021-04-03 22:47:11 · 140 阅读 · 0 评论 -
4. 变量和不同的赋值方式
1. 变量的定义和使用makefile中支持程序设计语言中变量的概念makefile中的变量只代表文本数据(字符串)makefile中的变量名规则:变量名可以包含字符,数字,下划线不能包含“:”,“#”,“=”或“ ”变量名大小写敏感CC := gccTARGET := hello.out$(TARGET) : func.o main.o$(CC) : &(TARGET) func.o main.o使用变量的好处:方便更换编译器(gcc g++等)和生成文件的名字(h原创 2021-04-03 21:36:58 · 470 阅读 · 0 评论 -
3.伪目标的引入
1. 示例clean:(tab)rm *.o hello.out执行make clean时,删除所有的.o文件和hello.out文件当再次make后,执行make clean后显示该文件已是最新…2. 伪目标的引入伪目标的语法:先声明,后使用本质:伪目标是make中特殊目标.PHONT的依赖.PHONY : cleanclean:(tab)rm *.o hello.out3. 伪目标的妙用.PHONY : clean rebuild allrebuild : clean原创 2021-04-03 19:51:43 · 68 阅读 · 0 评论 -
2. makefile的结构
1. makefile元素含义target:通常是需要生成的目标文件名make所需要执行的命令名称prerequisities:当前目标所依赖的其他目标或文件command:完成目标所需要执行的命令注意targets可以包含多个目标:使用空格对多个目标名进行分隔prerequisites可以包含多个依赖:使用空格堆多个依赖进行分隔2. 规则中的注意事项[Tab]:‘\t’每一个命令行必须以[Tab]字符开始[Tab]字符告诉make此行是一个命令行续行符:可以将内原创 2021-03-24 23:39:48 · 127 阅读 · 0 评论 -
1. make和makefile
1. makemake是个应用程序解析源程序之间的依赖关系根据依赖关系自动维护编译工作执行宿主操作系统中的各种命令2. makefilemakefile是一个描述文件定义一系列的规则来指定源文件编译的先后顺序拥有特定的语法规则,支持函数定义和函数调用能够直接集成操作系统中的各种命令3. makefile实例//hello:(Tab)echo “hello makefile”make -f mf.txt hello功能说名:以hello关键字作为目标查找mf.tx原创 2021-03-24 23:16:37 · 75 阅读 · 0 评论