2.详解make,makefile,进度条程序

文章介绍了make和makefile在工程管理中的作用,通过makefile自动化编译源文件,以及make如何根据文件依赖关系决定是否重新编译。同时,文中还探讨了进度条的原理,展示了如何在C语言中实现简单的进度条效果。
摘要由CSDN通过智能技术生成

目录

make和makefile前言

问:为什么有make和makefile?

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

问:make和makefile是什么?

makefile是当前目录下的文件,make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法

makefile文件的创建

创建一个makefile文件(也可以将文件名写成Makefile)

vim makefile

  1 code:code.o
  2     gcc code.o -o code
  3 code.o:code.s
  4     gcc -c code.s -o code.o
  5 code.s:code.i
  6     gcc -S code.i -o code.s
  7 code.i:code.c
  8     gcc -E code.c -o code.i
  9 clean:
 10     rm -rf code.i code.s code.o code

在这里插入图片描述

makefile中语法的简写:

  1 code:code.o
  2     gcc $^ -o $@
  3 code.o:code.s
  4     gcc -c $^ -o $@
  5 code.s:code.i
  6     gcc -S $^ -o $@
  7 code.i:code.c
  8     gcc -E $^ -o $@
  9 clean:
 10     rm -rf code.i code.s code.o code

在这里插入图片描述

make指令的使用

make后面不接目标文件则默认执行的是makefile中的第一个目标文件

若没有依赖文件,makefile中扫描是否有其他依赖文件,make会自动化推导依赖关系(栈式结构)

[bit_wf@wf lesson8]$ ls
code.c  makefile
[bit_wf@wf lesson8]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code
[bit_wf@wf lesson8]$ ls
code  code.c  code.i  code.o  code.s  makefile

在这里插入图片描述

[bit_wf@wf lesson8]$ make clean
rm -rf code.i code.s code.o code
[bit_wf@wf lesson8]$ ls
code.c  makefile

在这里插入图片描述

make目标文件的更新条件

make一遍后再make就会显示”make:code是最新的。“ ——不是总是被执行
若修改文件,则make可以重新编译

[bit_wf@wf lesson8]$ ls
code.c  makefile
[bit_wf@wf lesson8]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code
[bit_wf@wf lesson8]$ make
make: “code”是最新的。
[bit_wf@wf lesson8]$ make
make: “code”是最新的。
[bit_wf@wf lesson8]$ make clean
rm -rf code.i code.s code.o code
[bit_wf@wf lesson8]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code

问:这个make是怎么实现的呢?

若.c文件的修改时间比.exe文件的修改时间新,则需要重新编译
若.c文件的修改时间比.exe文件的修改时间老,则不需要重新编译

touch:更改文件时间

更改code.c文件后又可make编译了

[bit_wf@wf lesson8]$ ls
code  code.c  code.i  code.o  code.s  makefile
[bit_wf@wf lesson8]$ make
make: “code”是最新的。
[bit_wf@wf lesson8]$ touch code.c
[bit_wf@wf lesson8]$ make
gcc -E code.c -o code.i
gcc -S code.i -o code.s
gcc -c code.s -o code.o
gcc code.o -o code

进度条原理

  1. 了解回车,换行:

\r为回车, \n为换行

  • 回车:光标重新回到本行开头
  • 换行:光标前往下一行(不一定到下一行行首)

在C语言中\n是换行+回车
2. 了解缓存区

在这里插入图片描述
说明了: 打印的信息一定存在某个位置———这个位置就是存在了缓存区里面

**fflush函数:**强制刷新缓存区到stdout(屏幕)
在这里插入图片描述

  1. 进度条原理
    在这里插入图片描述

进度条的实现

//要放大窗口再执行,才有进度条的效果
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     int i = 0;
  7     char buf[128] = {'\0'};
  8     for (i = 0; i < 100; ++i)
  9     {
 10         buf[i] = '=';
 11         printf("%s\r", buf);
 12         usleep(50000);
 13         fflush(stdout);
 14     }
 15     return 0;
 16 }    

在这里插入图片描述
进度条的优化:
优化1:
在这里插入图片描述
优化2:
在这里插入图片描述
优化3:
在这里插入图片描述
实现代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 
  4 int main()
  5 {
  6     int i = 0;
  7     char buf[128] = {'\0'};
  8     const char* lable = "|/-\\";
  9     for (i = 0; i < 100; ++i)
 10     {
 11         buf[i] = '=';
 12         if (i < 99)
 13             buf[i + 1] = '>';
 14         printf("[%-100s][%3d%%][%c]\r", buf,i + 1, lable[i % 4]);
 15         usleep(50000);
 16         fflush(stdout);
 17     }
 18     printf("\n");
 19     return 0;
 20 }                                                                                                                                                                                           
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值