常州网站建设推荐,卖保健品可以自己做网站卖吗,网站怎么增加代码,做搜狗网站#x1f525;博客主页#xff1a;小王又困了
#x1f4da;系列专栏#xff1a;Linux
#x1f31f;人之为学#xff0c;不日近则日退
❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 目录
一、认识make/Makefile
#x1f4d2;1.1make/Makefile的优点
#x1f4d2;…
博客主页小王又困了
系列专栏Linux
人之为学不日近则日退
❤️感谢大家点赞收藏⭐评论✍️ 目录
一、认识make/Makefile
1.1make/Makefile的优点
1.2make/Makefile的使用
二、依赖关系和依赖方法
2.1依赖关系
2.2依赖方法
三、make工作原理 ️前言 以前我们的代码中有多个源文件是编译器把它们链接起来形成可执行程序。 而在linux中需要我们手动进行这个过程使用gcc一个一个源文件的编译十分繁琐这就需要我们的自动化构建工具——make/Makefile。 一、认识make/Makefile make是一个用于自动构建编译和链接程序的工具它通过读取一个叫做Makefile的文件来确定程序的构建规则和依赖关系。Makefile包含了一系列规则每个规则指定了如何生成一个或多个目标文件并列出了生成这些文件所需要的依赖关系和相应的命令。
make是一条命令Makefile是一个文件
make是一个解释Makefile中指令的命令工具两个搭配使用完成项目自动化构建。
1.1make/Makefile的优点 一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中在VS中是编译器器将这些源文件链接起来而在Linux中需要我们自己编译我们也不知道哪些文件需要先编译哪些文件需要后编译所以我们使用了自动化构建工具—make/Makefile。
优点
make和Makefile的使用可以大大简化项目的构建过程确保只有必要的文件被重新构建提高了项目的可维护性和可重用性。自动化编译一旦写好只需要一个make命令整个工程完全自动编 译极大的提高了软件开发的效率。
1.2make/Makefile的使用
make工具的主要作用是根据Makefile文件中的规则来自动构建项目所以我们要先创建一个Makefile文件这里的M大写小写都可以。 在makefile文件中写入依赖关系和依赖方法。 make的使用 这里我们可能会有一个疑问问什么形成可执行程序只需要输入make呢。这就要我们了解make的命令行语法基本的make命令行语法是make [target]其中target是Makefile中定义的目标名。如果没有指定目标make将执行Makefile文件中第一个依赖方法。 二、依赖关系和依赖方法 依赖关系指的是目标文件target和它所依赖的文件之间的关系而依赖方法则是描述如何生成目标文件的规则。例如月底你的生活费用完了于是你给你的老爸打电话告诉他“老爸我是你儿子我没钱啦”。给你的老爸打电话说你是他儿子就叫做表明依赖关系。但是只表明依赖关系你爸并不知道你是缺钱。所以要有依赖方法要告诉他“我没钱啦”你把才知道要给你打钱。因此只有依赖关系加上依赖方法才能完成打钱这件事情。
2.1依赖关系 在 Make 中依赖关系定义了目标文件和其它文件之间的关系。一个目标文件可能依赖于一个或多个文件称为依赖项这些文件可以是源代码文件、头文件、或者其他目标文件。依赖关系通过规则来定义通常具有以下形式
target: dependenciescommandstarget 是目标文件的名称。dependencies 是目标文件依赖的文件列表。commands 是生成目标文件的命令称为规则。 示例
mycode:code.cgcc code.c -o mycode
上述规则表示 mycode 依赖于 code.c 生成 mycode 的命令是用gcc编译 code.c 并将输出保存为 mycode 。
2.2依赖方法 在 Make 中依赖方法是指生成目标文件的具体命令或规则。上述示例中的 gcc code.c -o mycode 就是一个依赖方法。依赖方法可以包括编译、链接、拷贝等操作具体取决于生成目标文件的需求。 gcc code.c -o mycode
注意依赖方法前面有一个Tab 总体来说Make 的依赖关系和依赖方法是构建系统中非常重要的概念通过它们可以定义项目中文件之间的关系以及如何生成最终的可执行文件或库。
三、make工作原理
理解makefile 我们要形成mycode目标文件并不是直接依赖code.c实际依赖的是code.o然而我们当前目录下并没有code.o所以我们要先形成code.ocode.o又依赖code.s但是当前目录下也没有code.s经过递归我们就可以找到递归的出口code.c然后逆向执行依赖关系。指令的执行顺序与我们写入makefile文件的顺序是反过来的。所以保存这些依赖关系的是一种栈式的结构。 总结 mycode会自动推导依赖关系然后根据依赖关系逆向执行依赖方法。由于是自动推导所以mycode文件中的依赖方法可以是任意顺序但是不能缺少。
make不能连续编译
如下图当执行完一次make对源代码编译后再去执行make就不会对源代码重新编译。 这是因为我们编译得到一个可执行程序没有在对它进行修改就没有必要对它重新编译。那我们是怎么知道是否对源文件进行过修改的呢 我们对文件修改都会有时间记录我们通过时间就可以知道文件是否被修改过。要形成可执行文件一定是先有源文件再有可执行文件所以源文件的最近修改比可执行文件要早。如果源文件最近修改时间就比可执行文件晚那么说明文件被修改过。
查看文件修改时间
指令stat code.c Access文件最近一次被访问的时间查看文件内容、修改文件内容都属于访问文件。Modify最近一次修改文件内容的时间。Change最近一次修改文件属性的时间。
这三个时间是相互关联的有的操作可能会同时更新多个时间。例如修改文件的内容那这三个时间都会更新因为修改文件内容首先要访问该文件其次修改后文件的大小会发生变化所以这三个时间都会更新。 修改权限只有Change改变上面我们修改文件内容访问时间却没有改变这是为什么呢
在许多情况下默认情况下文件系统不会在每次文件被读取时都更新访问时间。这是为了减少磁盘I/O操作的频率从而提高性能。 手动更新文件时间
touch code.c将code.c文件的所有时间更至最新。touch -m code.c将code.c文件的Modify时间更至最新touch -a code.c将code.c文件的Access时间更至最新touch -c code.c将code.c文件的Change时间更至最新 .PHONY伪目标
伪目标 用于指定一些不是真正文件名的目标通常用于执行一些特殊的任务而不生成对应的文件。
.PHONY: clean
clean:rm -f mycode特殊符号
$表示标签依赖关系冒号左边的内容。$^表示依赖的文件依赖关系冒号右边的内容。
mytest:test.cgcc $^ -o $
.PHONY:clean
clean:rm -rf mytest变量
变量 可以在 Makefile 中定义变量以方便在规则中引用。
CC gcc
flag -o
mytest:test.c$(cc) $^ $(flag) $
.PHONY:clean
clean:rm -rf mytest
取消执行make指令时的回显
每次执行make指令都会把对应的依赖方法回显出来如下图 我们只要在makefile文件中的依赖方法前面加上就可以取消回显。
CC gcc
flag -o
mytest:test.c$(cc) $^ $(flag) $
.PHONY:clean
clean:rm -rf mytest 结语 本次的内容到这里就结束啦。希望大家阅读完可以有所收获同时也感谢各位读者三连支持。文章有问题可以在评论区留言博主一定认真认真修改以后写出更好的文章。你们的支持就是博主最大的动力。