认识make/makefile
make是一个命令
makefile是一个当前目录下的文件。
make会自动推导makefile中的依赖关系,栈式结构。形成可执行文件
如何清理
在makefile文件里加上clean,运行时直接make clean,建议clean放在后面。
在没有改变源文件的情况下make一次后就不能再进行编译了,这是因为没有必要再编一次,主要是为了提高编译效率。
那么他是怎么做到的呢?
一定是源文件形成的可执行,现有源文件,才有可执行,一般而言,源文件的最近修改时间比可执行文件要老。如果我们更改了源文件,历史上曾经还有可执行,那么源文件的最近修改时间,一定要比可执行程序要新。只需要比较,可执行程序的修改时间和源文件的最近修改时间。可执行程序新于源文件,就不让再次编译了,如果旧于源文件就可以再编译。
一般而言,.exe != .c
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译!依赖关系不一定总是被执行的,我想让对应的依赖关系总是被执行,我们需要用.PHONY来实现,这就是所谓的伪目标
我们建议用.PHONY来修饰clean
关于文件的时间
stat 文件名查看文件时间
access 最近访问时间。
文件 = 文件内容 + 文件属性
modify 对文件内容做修改
change 对文件属性做修改
文件内容修改,可能会更改属性。
touch + 存在的文件 所有的时间都改成最新的,上述比较的时间是modify时间
特殊符号
@gcc -o $@ $^
$@ 冒号左边
$^ 冒号右边
@不需要回显
processbar:processbar.c main.c
2 gcc -o $@ $^
3 .PHONY:clean
4 clean:
5 rm -rf processbar
Linux中第一个小程序—进度条
实现目标
[##> ][40%][ \ ]
1、回车换行
回车:返回到第一个字符。
换行:走到下一行。
2、缓冲区
顺序执行1、2。
在sleep期间,“hello world”在哪里?一定是被保存到缓冲区里了。就是由C语言维护的一段内存空间。
如果我要强制刷新呢?
标准输入,标准输出,标准错误。使用fflush刷新缓冲区
倒计时程序
1 #include "prcessbar.h"
2 #include <stdio.h>
3 #include <unistd.h>
4 int main()
5 {
6 int cnt = 9;
7 while(cnt--)
8 {
9 printf("%d\r",cnt);
10 fflush(stdout);
11 sleep(1);
12 }
13 return 0;
14 }
进度条小程序
#include "prcessbar.h"
void processbar()
{
int cnt = 0;
char buffer[NUM];
memset(buffer,'\0',sizeof(buffer));
char* lable = "|/-\\";
while (cnt<=100)
{
printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%4]);
fflush(stdout);
buffer[cnt++] = STYLE;
usleep(100000);
}
printf("\n");
}