重庆智能网站建设哪里好,产品展示型网站有哪些,怎么躲避wordpress审核评论,聊城做网站的公司案例目录 1.前言--make/makefile的引入 2.快速上手make/makefile---自动化构建 3.关于依赖关系和依赖方法 4.自动化清理 为什么我们执行编译的时候#xff0c;make一下就好#xff0c;清理却要使用make clean? 5. make/makefile是如何知道当前目录下可执行文件是否为最新 6.文件… 目录 1.前言--make/makefile的引入 2.快速上手make/makefile---自动化构建 3.关于依赖关系和依赖方法 4.自动化清理 为什么我们执行编译的时候make一下就好清理却要使用make clean? 5. make/makefile是如何知道当前目录下可执行文件是否为最新 6.文件的三个时间 6.1 Modify 修改时间-----修文件内容的时间 6.2对属性修改的时间change 6.3access时间是访问时间查看文件内容的时候发生改变 touch命令更新时间 7.make/makefile 语法补充 7.1 .PHONY目标文件名 7.2 使用$代表目标文件。使用$^代表依赖文件列表 8.make/makefile应用第一个 linux小程序进度条 8.1知识铺垫 8.1.1缓冲区 8.1.1.1sleep函数 8.1.2 回车与换行 8.1.3 缓冲区换行回车综合-----倒计时程序 8.2 入门版本进度条 8.3 升级进度条改造 8.3.1.进度推进 8.3.2.百分比 8.3.3.旋转光标 编辑 8.4 进度条结合实际 9.结语 1.前言--make/makefile的引入 在windows下的vs中当我们的项目中有多个源文件的时候我们直接点击运行就将多个源文件生成.o文件再和库中的.o文件进行链接生成可执行程序也可以源文件之间自由组合形成多个可执行程序但是并不关心他们之间的依赖关系哪里是源文件哪里是头文件先链接那个文件、后链接那个文件这是因为vs编译器主动帮用户做了然而在linux中需要我们手动操作。
一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的 规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂 的功能操作。makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编 译极大的提高了软件开发的效率。 make是一个命令工具是一个解释makefile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一 种在工程方面的编译方法。 make是一条命令makefile是一个文件两个搭配使用完成项目自动化构建。
make是一个命令makefile是一个文件主旨 而makefile是需要在当前工作目录下需要我们自己创建的一个文件。
保存的是依赖关系和依赖方法。
2.快速上手make/makefile---自动化构建
我们首先创建一个.c文件 创建一个makefile文件文件名不能写错可以写Makefile/makefile vim makefile文件 保存退出当我们需要编译这段代码的时候直接使用make指令 接下来我们就来了解一下依赖关系和依赖方法
3.关于依赖关系和依赖方法
故事某天员工小明发现到了发工资的日子但是老板忘记给他打钱了于是就给老板打去电话老板我是你的员工小明表明关系希望把工资发给我依赖方法。老板说好的下午打上卡。
文中的小明的第一句话就是在说明自己和老板的依赖关系通俗来讲依赖关系就是说明我为什么要给你而不是将电话打给别的老板
依赖方法如何发工资
所以代码中 mybin依赖于mytest.c第二行就说明了从mytest.c到mybin的方法。
第一行中表明依赖关系依赖关系的表明上使用冒号作为分隔符冒号左边称为目标文件
冒号右边称为依赖文件列表。 4.自动化清理
当我们再次执行make时发现 告诉我们当前的可执行文件已经是最新的了因为我们编译好过后就没有对源文件再进行过更改。
如何清理项目清理可执行程序
debug的时候需要将代码清理掉重新编译
方法打开makefile定义一个clean依赖关系为空
依赖方法为tab键开头 rm 目标文件名如果有其他临时文件删除就可以 执行make clean指令就可以清理我们的可执行程序 如果再次清理就会报错没有这个文件不想看到报错可以添加-f选项 而后我们在make就可以重新编译了 这就是自动化清理
为什么我们执行编译的时候make一下就好清理却要使用make clean?
因为
①make和makefile执行文件的时候某认是从上到下执行。
如果我们调换一下mkefile文件里面的内容make时某认就是clean: ②某认只形成一个执行
5. make/makefile是如何知道当前目录下可执行文件是否为最新
当我们再次执行make时发现 告诉我们当前的可执行文件已经是最新的了因为我们编译好过后就没有对源文件再进行过更改。
但是如果使用gcc指令还是可以编译 那么说明对当前可执行文件的检查是make和makefile做的那么make和makefile是如何知道我们当前目录下的可执行文件是否是最新的呢。
一个文件对应三个时间创建时间、内容被修改时间、权限被修改时间。只要可执行文件的最近
修改时间比所有的源文件的最近修改时间新那么说明它就是最新的。
源文件和可执行程序时间是不会一样的逻辑上。
如果我们这里有十个源文件但是只对其中一两个进行了修改那么最终可能就是将老的obj项目和新的合并这个时候编译可能还报错但是重新生成解决方案就没有错误了就是这个原因。
6.文件的三个时间
查看文件相关时间属性使用指令stat 文件名 6.1 Modify 修改时间-----修文件内容的时间
我们现在使用vim写入一段代码然后再修改一下代码观察一下时间 当前的modify时间为 我们现在对代码进行修改 modify时间为 change也跟着修改了
文件 内容属性
对内容修改modify
6.2对属性修改的时间change
属性ll命令下看到的都是文件内容我们现在修改一下文件的属性 只有change的时间发生了改变 对内容做修改时删除了代码增加了代码文件大小属性也改变了所以change也会改变。
6.3access时间是访问时间查看文件内容的时候发生改变
当前 修改后
只有access的时间发生了改变
但是如果连续查看可能时间就不会变化这是因为不是每一次查看都会更改时间在linux的历史中最开始是读写文件都会使访问时间修改但是这个也是数据也需要操作系统写入磁盘进行记录和其他两个时间不同访问文件的比重要比其他两个操作的比重大得多数据更新频率很快而且如果文件数量很多访问时间的更新又要求实时操作系统就会花费很大的∠(°ゝ°)和资源来做这个时间更新所以连续查看不会更新访问时间。
可执行程序和源文件比较的是modify。看源代码是否被更改
那么在不修改文件内容的前提下可以调用touch命令来更新文件的时间。
touch命令更新时间
touch 文件名没有这个文件的时候帮我们创建文件
有这个文件的时候会刷新这个文件的时间。
那么就可以再次make.
7.make/makefile 语法补充
7.1 .PHONY目标文件名
这是一个关键字修饰mybin这个目标文件使其成为一个伪目标。
该目标文件总是被执行 这个目标文件的依赖关系和依赖方法 在make时总是执行
使得我们每次想要重新编译就可以重新编译不用touch修改时间。 惯用做法一般将清理设置为伪目标。
7.2 使用$代表目标文件。使用$^代表依赖文件列表 正常运行 makefile也支持变量定义 但是我们的可执行程序不仅仅只是依赖一个.c文件那么简单
makefile会先对依赖关系执行推导再逆向执行依赖方法 8.make/makefile应用第一个 linux小程序进度条
8.1知识铺垫
8.1.1缓冲区
8.1.1.1sleep函数 让程序执行到sleep函数时休眠指定的秒数
我们编写这个程序
生成可执行文件并运行我们会发现会先打印然后三秒过后程序结束。 将程序修改如下去掉换行符 执行编译运行发现前三秒什么也没有三秒后打印程序结束 两个程序都是顺序执行的对于第二个程序来说程序在休眠时间printf已经跑完了木有看到字符串那么这个字符串一定是被保存在某个地方c对IO提供了一个缓冲区程序结束时拿出来。我们的printf输出并不是直接就将数据输出到我们的屏幕上而是先将数据放入了缓冲区可以理解为一段内存空间当有\n时就会1立即刷新缓冲区内容到屏幕没有\n的时候没有立即刷新还在内存中看不到程序结束的时候会把缓冲区内容刷新到屏幕。 8.1.2 回车与换行
严格意义上回车与换行不一样回车与换行控制光标移动
换行从当前光标位置跳到下一行相同的位置叫做换行
回车从当前光标位置回到当前行最开始叫做回车。
\n实际上是回车换行 \r 只回车不换行
8.1.3 缓冲区换行回车综合-----倒计时程序
编写这个程序
我们发现运行的时候并不会出行我们的10,9,8.。。。倒计时内容是因为混冲区没有刷新的问题
介绍flush函数刷新一下我们的缓冲区 刷新一个流C语言程序默认在启动的时候会打开三个流。stdin标准输入 stdout标准输出 stderr标准错误所以可以直接从键盘读取数据直接输出数据到屏幕 如果开始是10就会打印90 80 这是因为显示器只认识字符 10打印完9.8等只会覆盖第一个字符修改如下 就OK了。 8.2 入门版本进度条
进度条原理就是不换行递增式输出
第一次打印一个然后第二次光标不换行回车到最开始打印两个符号一次增加实现覆盖增长。
直接上代码
补充sleep函数以秒为单位usleep函数以毫秒为单位 结果如下 8.3 升级进度条改造
建立多个文件 建立依赖关系 可以直接使用.c 8.3.1.进度推进 效果 8.3.2.百分比
%%实现
8.3.3.旋转光标
| / -\\交替打印 8.4 进度条结合实际
上述程只是一个演示百分比等都是简单演示进度条程序应该和某些程序捆绑起来比如说下载比如说传递那么我们已经下载的比上我们文件总的大小得到真正的下载百分比我们的进度条也应该控制到这个进度还有下载卡顿的时候我们的光标不旋转进度条不推进。
我们现在模拟一种下载的场景 进度条代码修改为 编译运行 可以彩色输出搜索printf彩色输出即可。
9.结语
以上就是本期的所有内容知识含量蛮多大家可以配合解释和原码运行理解。创作不易大家如果觉得还可以的话欢迎大家三连有问题的地方欢迎大家指正一起交流学习一起成长我是Nicn正在c方向前行的奋斗者数据结构内容持续更新中感谢大家的关注与喜欢。