机械厂做的网站模板叫什么,搜索推广开户,wordpress工具栏条,营养师目录 一、make的默认目标文件与自动推导
二、不能连续make的原因
执行原理
touch
.PHONY伪目标 make指令不回显
makefile多文件管理
简写依赖方法
三、回车与换行
四、缓冲区 一、make的默认目标文件与自动推导
假设这是一个makefile文件#xff0c;make的时候默认生…目录 一、make的默认目标文件与自动推导
二、不能连续make的原因
执行原理
touch
.PHONY伪目标 make指令不回显
makefile多文件管理
简写依赖方法
三、回车与换行
四、缓冲区 一、make的默认目标文件与自动推导
假设这是一个makefile文件make的时候默认生成第一行的目标文件 make会自动推导makefile中的依赖关系推导过程是一个栈式结构。
hello:hello.ogcc hello.o -o hello
hello.o:hello.sgcc -c hello.s -o hello.o
hello.s:hello.igcc -S hello.i -o hello.s
hello.i:hello.cgcc -E hello.c -o hello.i 即使我们打乱了下面六行的顺序结果还是相同最终编译出来的任然是hello
hello:hello.ogcc hello.o -o hello
hello.o:hello.sgcc -c hello.s -o hello.o
hello.i:hello.cgcc -E hello.c -o hello.i
hello.s:hello.igcc -S hello.i -o hello.s 而如果hello.s为目标文件那么程序编译到hello.s就会结束了
hello.s:hello.igcc -S hello.i -o hello.shello.i:hello.cgcc -E hello.c -o hello.ihello.o:hello.sgcc -c hello.s -o hello.ohello:hello.ogcc hello.o -o hello
二、不能连续make的原因
在进行make操作时我们不能连续make因为如果源文件已经被编译过了并且源文件没有被修改那我们就没有必要编了这样子可以提高效率。
执行原理
因为一定是先有源文件再有可执行文件的所以一般而言源文件的最早修改时间是要比可执行文件早的
如果源文件被修改过历史上还有可执行文件那么源文件的最近修改时间一定比可执行文件晚
我们可以使用stat 文件名 来查询文件的时间问题 access 为最近访问时间但是由于我们不管是进行文件的 内容或者属性修改都会进行访问因此access会在多次被访问之后才会更新一次
modify则是文件内容被修改的最近一次时间
change是文件属性被修改的最近一次时间包括文件名文件大小文件创建日期文件的权限等等
值得注意的是因为修改文件内容时绝大多数时候文件的大小都会改变因此modify改变大部分情况change也都会改变而修改文件属性时则不会改变modify
touch
我们如果使用touch 文件名 那么 accessmodifiychange都会改变到当前时刻我们也可以使用选项单个修改
-m 修改modify但是同时change也会改变
-a改变access
而make是否执行依赖关系比较的是modify
.PHONY伪目标
那如果我想让对应的依赖关系总是被执行呢
我们可以在依赖关系前面添加.PHONY:即为伪目标。添加.PHONY:后依赖关系总是会被执行。我们一般会在clean 的前面添加
mytest.exe : mycode.c //依赖关系gcc -o mytest.exe mycode.c //这行的开头要求是一个tab 这行称为依赖方法
.PHONY: clean
clean: rm -f mytest.exe make指令不回显
执行make 和make clean 时依赖方法会进行回显
我们可以在依赖方法前带上
mytest.exe : mycode.c gcc -o mytest.exe mycode.c
makefile多文件管理
makefile 还支持多文件管理例如
processbar: processbar.c main.c //如果.h文件与这两个文件在同一目录下那么gcc是能自己找到.文件的
(假设这个项目由processbar.h ,processbar.cmain.c组成)
简写依赖方法
特殊符号$可以表示依赖关系冒号左边的文件$^可以表示冒号右边的文件
mytest.exe : mycode.c gcc -o $ $^mytest.exe : mycode.c main.c gcc -o $ $^
三、回车与换行
回车指的是将光标移动到改行的开头
换行指的是将光标移动到下一行
四、缓冲区
缓冲区就是c语言维护的一段内存
我们编译并运行代码1
#include stdio.h
int main()
{
printf(hello Makefile!\n);
sleep(3);
return 0;
}
会观察到程序会先打印再停顿三秒
而当我们编译并运行代码2
#include stdio.h
int main()
{
printf(hello Makefile!);
sleep(3);
return 0;
}
我们会看到程序会先停顿三秒再输出。
这难道是代码执行顺序改变了吗其实知识因为去掉\n后printf输出的内容被存到缓冲区内
当我们执行代码3时
#include stdio.h
int main()
{
printf(hello Makefile!);
fflush(stdout);
sleep(3);
return 0;
}
效果又会同代码1一样了这时候因为我们使用fflush刷新了stdoutstdout是标准输出流即显示器