makefile-gdb文件

​ 可以在文件中指定那些文件可以先进行编译,那些文件可以后进行编译,那些文件可以重新编译。他可以自动化编译程序。。。。

6-1 makefile基本规则

​ 如下:

目标: 依赖

(tab) 命令

​ 规则三要素:

目标:要生成的目标文件。

依赖:目标文件由那些文件生成。

命令:执行命令以便生成目标。

例子: makefile的第一种写法:

​ 这样写的效率最低,修改一个文件时,所有文件都会重新编译。

6-2 makefile的工作原理

​ 如果想要生成目标,则检查规则中的依赖是否都存在,如果不存在向下寻找,看看有没有生成该依赖文件 的规则,如果有则先生成该依赖,然后再回到刚才的地方生成目标。如果没有则报错

​ 如果想要生成目标的依赖都存在,则检查规则中的目标是否要更新,而且要先检查该目标的依赖是否有更 新,如果有则必须更新该目标。也就是依赖比目标新 更新目标文件

例子:makefile的第二种写法:

​ 上图中,如果要生成可执行文件main则需要满足四个依赖,很显然在第一行四个依赖都不满足,于是向 下寻找缺少的依赖是否也需要被生成。然后就发现main的依赖之一main.o需要又一个依赖main.c来生成。 然后生成main.o文件。以此类推。上图代码过于冗余,不建议怎么写。

6-3 makefile中的变量

​ makefile中有三种变量:普通变量,自带变量,自动变量。

普通变量

​ 定义变量时使用“=

​ 使用变量时应该这样:$(变量名)

​ 例子:

​ acr = test.txt //定义变量acr并且为其赋值

​ bar = $(test.txt) //定义变量baar,并且使用之前的acr变量为其赋值

​ makefile中有一些固定的变量可以让用户直接使用,我们可以为其赋值。

CC = gcc #arm-linux-gcc

CPPFLGS : //C预处理的选项 -I (大写i)

CFLGS: //C预编译的选项 -Wall -g -c

LDFLAGS: //链接器选项 -L -l

自动变量:(只能在规则的命令中使用)

$@: 表示规则中的目标

$<: 表示规则中的第一个条件

$^: 表示规则中的所有条件,组成一个列表,以空格分隔开,如果列表中有相同项这会消除相同项。

模式规则:

​ 至少在规则的目标定义中要包含’%’, ‘%’表示一个或多个, 在依赖条件中同样可以使用’%’, 依赖条件中的’%’的 取值取决于其目标:

​ 比如: main.o:main.c fun1.o: fun1.c fun2.o:fun2.c, 说的简单点就是: xxx.o:xxx.c

例子:markfile文件的第三种写法:

​ 上图markfile文件解析:

​ 1.定义一个变量target 并且为其赋值为main(main是可执行程序的名字)

​ 定义一个变量object 并且为其赋值。(赋值内容为main的依赖条件)

​ 使用自带的CC变量,并且为其赋值。

​ 使用自带的CPPFLAGS变量,并且为其赋值。(这个变量是 预处理-I的那个参数)

​ 2.$(target) : $ (object) 这里是使用变量。

​ 上述内容展开后如下:main:main.o fun1.o fun2.o sum.o

​ 3.$(CC) -o $@ $^ 这里先使用了CC变量,然后使用自带变量$@表示当前规则中的目标,也就是object 变量的值,$^表示要逐个取用规则中的目标,如果有重复则消除重复。

​ 上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o

​ 4.%.o:%.c 这里表示生成一个或多个.o目标文件需要一个或多个%.c依赖

​ 5.$(CC) -o $@ -c %< $(CPPFLAGS) 这个不多说,我们直接展开

​ 上述内容展开后如下:gcc -o main.o fun1.o fun2.o sum.o -c main.c fun1.c fun2.c sum.c

6-4 makefile函数

​ 以下是常见函数:

​ 1.wildcard 查找指定目标下的指定类型的文件,例如:scr=$(wildcard *.c) 可以将当前目录下所以后缀为.c的文件赋值给src。

​ 2.patsubst 匹配替换,例如:obj=$(patsubst %.c,%.o,$(src)) 把变量src中所有后缀为.c的文件替换成.o。

​ 通过以上代码,发现这里的函数也会有返回值。

例子:markfile的第四种写法:

​ 上图的makefile文件的解析:

​ 现在假设当前目录想有源文件one.c 和 two.c

​ 1.src=$(wildcard ./*.c) 这里使用wildcard来搜索当前目录下的所有后缀为.c的文件,并且将其赋值给 src。此时src等于oen.c two.c

​ 2.object=$(patsubst %c,%.o,$(src)) 这里通过patsubst;来将变量src中所有.c替换为.o,替换完成后变 量src的值为 one.o two.o

​ 3.定义一个普通变量target,并且为其赋值为main

​ 4.使用自带的CC变量CPPFLAGS变量,并且为其赋值

​ 5.$(target)(object) 这个不多说了,展开后:main:oen.o two.o

​ 6.$(CC) -o $@ $^ 这个也不多说了,展开后:gcc -o main -c oen.o two.o

​ 7.%.o:%.c 不多说,展开为:one.o:one.c 和 two.o:two.c

​ 8.$(CC) -o $@ -c $< $(CPPFLAGS) 不多说

​ 展开后为:gcc -o one.o -c one.c 和 gcc -o two.o -c two.c

6-5 makefile的清理操作

​ 我们在编译刚才中,会将.c文件生成为.o文件,然后再通过.o生成out可执行文件,当一切操作完成之后 我们就可以使用我们的out可执行文件了,但是刚才生成的.o文件还在我们的磁盘是,此时这些东西已经没有 用了,所以我们可以通过某些方法来清除编译中间生成的.o文件。

​ 我们在makefile文件中使用一个特殊的规定来定义清理操作,通常命名为clean,我们让这个规则用于删 除编译过程中的.o文件。

​ clean命令中的特殊符号:

​ “-” 此条命令出错,make也会继续执行后续的命令。

rm -f 强制执行,比如要删除的文件如果不存在,使用-f则不会报错。

@ 不显示命令本身,只显示命令结果。可以让输出的东西看着更加整洁。

伪目标声明:

PHONY:clean

​ 当声明目标为伪目标后,makefile将不会检查目标是否存在或者该目标是否需要更新。

​ 声明为伪目标后,他不会管目标是不是文件什么的,只需执行mark clean即可执行目标clean下的命 令。

​ 其他:

​ 如果只执行make指令,不带任何参数的话,会默认执行第一个目标。

​ 执行make 指定的目标 即可执行指定的目标。

例子:makefile文件的第五种写法:

​ 上图makefile文件的解析:

​ 假设现在有两个源文件 one.c 和 two.c

​ 1.通过wildcard函数搜寻当前目录下所有以.c结尾的文件,赋值给变量src

​ 2.通过patsubst函数将src中所有的.c替换为.o

​ 3.定义变量target并且赋值为main

​ 4.使用自带变量CC并且赋值为gcc

​ 5.使用自带变量CPPFLAGS并且赋值。

​ 8.$(target)(object) 使用变量,展开后为 main:one.o two.o

​ 9.$(CC) -o $@ $^ 使用变量,展开后为 gcc -o main oen.o two.o

​ 10.%.o:%.c 使用自动变量,%代表一个或多个目标或依赖。

​ 展开为:one.o:one.c 和 two.o:two.c

​ 11.$(CC) -o $@ -c %< $(CPPFLAGS) 不多说了,

​ 展开为:gcc -o one.o -c one.c 和 gcc -o two.o -c two.c

​ 12. .PHONY:clean 声明伪目标clean 这样就可以直接执行make clean了

​ 13.clean 声明目标clean,并且这个目标没有依赖

​ 14.-rm -f $(target) $(object) 这里指目标clean有指令可以强制删除可执行程序和.o文件。

​ 展开为:rm -f main one.o two.o

MakeFile文件的使用 [补档-2023-07-13]的更多相关文章

  1. 利用 autoconf 和 automake 生成 Makefile 文件

    一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...

  2. linux下使用automake工具自动生成makefile文件

    linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...

  3. linux中Makefile文件相关内容

    第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,m ...

  4. Linux内核Makefile文件(翻译自内核手册)

    --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...

  5. 教会你如何编写makefile文件

    最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...

  6. 例解 autoconf 和 automake 生成 Makefile 文件

    本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Con ...

  7. 使用autoconf和automake生成Makefile文件(转)

    Makefile好难写 曾经也总结了一篇关于Makefile的文章<make和makefile的简单学习>.但是,总结完以后,发现写Makefile真的是一件非常痛苦的事情,的确非常痛苦. ...

  8. 【C编程基础】make命令和makefile文件

    1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...

  9. 工程管理之makefile与自动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的 ...

  10. makefile文件操作大全

     Makefile的规则 -- 转自 :http://blog.csdn.net/ruglcc/article/details/7814546/ 在讲述这个Makefile之前,还是让我们先来粗略地看 ...

随机推荐

  1. PS 独立集中标识下修改项目采购类型增强

    1.当物料独立集中标识为2,采购类型通过BAPI:BAPI_NETWORK_COMP_ADD,type_of_pur_resv传入'7',则报错"组件分配并不是未销售订单或项目库存而设的&q ...

  2. 最火前端Web组态软件(可视化)

    ​ 友情提示:本文为原创文章,转载请注明出处,商务合作请私信!!! 前言: 随着物联网.大数据等技术高速发展,我们逐步向数字化.可视化的人工智能(AI)时代的方向不断迈进.智能时代是工业 4.0 时代 ...

  3. 【TCP】学习笔记:application/octet-stream

    当浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,如果这个类型浏览器能够支持阅览,浏览器就会直接展示该资源,比如png.jpeg.video等格式 ...

  4. #1010:Tempter of the Bone(DFS + 奇偶剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  5. 【每日一题】35. [CQOI2009]中位数图 (前缀和,贡献值计算)

    补题链接:Here 算法涉及:前缀和,贡献值计算 经典中位数计数问题,记得以前百度之星也出过类似的题,这道题有一个限定范围是要奇数区间的 我们很容易想到,奇数下标到偶数下标或者偶数下标到奇数下标的长度 ...

  6. Golang之文件系统事件监听

    Golang之文件系统事件监听 基本介绍 文件系统事件是指文件系统相关的各种操作和状态变化,当一个应用层的进程操作文件或目录时,会触发system call,内核的notification子系统可以守 ...

  7. <vue 路由 6、动态路由-方法传递参数>

    一.query效果 点击query按钮 二.param效果 点击param按钮 注意点 1:重新刷新浏览器后,参数都不在了. 2:url中能看不到传递的参数 3.分别用{{$route. params ...

  8. java基础(12)--static变量/方法 与 无 static的变量/方法的区别

    一.static方法与非static方法的区别: 1.带有static方法调用:使用类名.方法名(),(建议,但也支持,"引用".变量的方式访问) 2.没有static方法调用(实 ...

  9. 使用vs插件进行远程调试linux服务器

    魔改Raspberry Debugger插件实现linux远程开发 本插件是在树莓派的远程调试下修改实现并未全部本人实现 插件基本使用: 插件目前只能在.net core 3.1到.net 6的框架下 ...

  10. 基于python+django的旅游信息网站-旅游景点门票管理系统设计与实现

    该系统是基于python+django开发的旅游景点门票管理系统.是给师弟做的课程作业.大家学习过程中,遇到问题可以在github咨询作者 演示地址 前台地址: http://travel.gitap ...