一、前言
会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒,⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀ 系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄ 于进⾏更复杂的功能操作。
Makefile最初由贝尔实验室的Stuart Feldman在1977年创建,至今仍是C/C++项目中最常用的构建工具之一,也被广泛应用于其他语言的构建流程中。
二、make与makefile
1.什么是make?什么是makefile?
make是⼀条命令,makefile是⼀个⽂件,两个搭配使⽤,完成项⽬⾃动化构建。
2.makefile的代码展示及解析
SRC=$(shell ls *.c)
BIN=$(SRC:.c=.o)
TFILE=tar
CC=gcc
METHOD1= -o
RM=rm -f
METHOD2= -c
$(TFILE):$(BIN)
@$(CC) $(METHOD1) $@ $^
@echo "link > > > $@ to $^"
%.o:%.c
@$(CC) $(METHOD2) $<
@echo "generet > > > .c to .o"
.PHONY:clean
clean:
@$(RM) $(BIN) $(TFILE)
@echo "remove $(BIN) and $(TFILE)"
其中:
1. “ = ”,可以理解成类似于宏定义,让其更美观。
2.“ $() ”,引用定义的变量。
3.“ @ ”, 隐藏指令,让指令不回显在屏幕中。
4.“ $@ ”,目标文件。
5.“ $^ ”,所有的依赖文件。
6.“ %.c %.o ”,当前列表中所有以.c、.o为后缀的文件。
7.“ $< ”,第一个依赖文件。
8.“ echo ”,让引号内的字符串显示在屏幕中。
3、.PHONY的修饰
.PHONY后面修饰的为伪目标,表示这这个指令总是被执行的。那么什么叫总是被执行呢?如何区分?我们知道,文件 = 属性 + 内容,文件当中有三个时间:
其中,Access时间只要你查看了时间就会更新,
Modify时间只有在文件的内容修改后才会更新,
Change时间在内容的属性修改之后才会修改,但属性包含文件的大小、时间、权限等等,因此通常情况下,修改文件的内容就会引起改变。
没有.PHONY修饰的情况下,受到Modify时间是否变化限制,多次执行不被允许,如图:
若被修饰,则不被限制可以多次执行:
三、进度条代码的实现
两个版本的实现,理论版和实际模拟版本。
#pragma once
#include<stdio.h>
#include<unistd.h>
#include<string.h>
void process();//版本1
void process_max(double progress,double total);//版本2
//.h文件
#include"process_bar.h"
#define N 101
#define picture '='
//实现文件
void process_max(double progress,double total){
char buff[N];
memset(buff,0,sizeof(char)*100);
char str[]="|/-\\";
int len = strlen(str);
int num = progress*100/total;
int i=0;
for(i =0;i<num;i++){
buff[i] = picture;
}
double numb = progress*100/total;
static int cnt=0;
printf("[%-100s][%.2lf%%][%c]\r",buff,numb,str[cnt%len]);
fflush(stdout);
sleep(1);
cnt++;
}
void process(){
char buff[N];
memset(buff,0,sizeof(char)*100);
char str[]="|/-\\";
int len = strlen(str);
int count = 0;
while(count<=100){
buff[count]= picture;
printf("[%-100s][%d%%][%-c]\r",buff,count,str[count%len]);
fflush(stdout);
sleep(1);
count++;
}
printf("\n");
}
#include"process_bar.h"
#define downlode 1024.0
#define speed 1.0
void downprocess(){
int current = 0;
while(current<=downlode){
current+=speed;
process_max(current,downlode);
}
printf("\nthe resource is downloded complete\n");
}
//主文件
int main(){
// process();
downprocess();
return 0;
}