【Linux】开发工具make/Makefile、进度条小程序

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

1.make/Makefile

1.什么是make和Makefile?


  • 一个工程中的源文件不计其数,它们按范例、功能、模块分别放在多少个目录中,makefile 界说了一系列的规则来指定,哪些文件必要先编译,哪些文件必要后编译,哪些文件必要重新编译,甚至于进行更复杂的功能操作。
  • makefile 带来的利益就是 “自动化编译”,一旦写好,只必要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make 是一个解释 makefile 文件中指令的命令工具,一样平常来说,大多数的IDE都有这个命令,好比:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见 makefile 成为了一种在工程方面的编译方法。
  • make 是一条命令,makefile 是一个文件,两个搭配使用,完成项目自动化构建。
  • 会不会写makefile,从一个侧面说明白一个人是否具备完成大型工程的能力,makefile 中的 m 巨细写都可以。

Makefile 文件中添加自动化清算命令

上面的 .PHONY: 是什么?


更加详细的过程,但不保举这么写

2.stat命令

标题来了:make 命令怎样知道形成可执行文件后,源文件被修改了? 答案:Modify 时间



  • touch的盲区:后添加一个已经存在文件,会更改文件的3个时间
  • PHONY作用:忽略 Modify 时间,所有源文件重新编译
3.Makefile单个文件的写法

更通用的写法:界说变量


4.Makefile多个文件的写法

Makefile有多个文件?
在工程中,我们一样平常会将所有的源文件先编译成目的文件,再将所有的目的文件与动态库进行动态链接,生成可执行程序。

  1. #循环创建5个文件的命令
  2. count=1; while [ $count -le 5 ]; do touch code${count}.c; let count++; done
复制代码

2.进度条

1.回车\r、换行\n


  • 回车\r:光标回到该行的第一个位置。
  • 换行\n:光标垂直向下到下一行,光标不会回到第一个位置。
C语言中的\n:本质是 \r+\n。
2.缓冲区



若想要将没有带 \n 的字符串立刻革新?fflush



3.进度条

1.倒计时程序



最终版本的倒计时程序

2.进度条程序

版本一:一次性展现进度条


版本二:边下载/上传,边更新进度条
Makefile 文件
  1. SRC=$(wildcard *.c)
  2. OBJ=$(SRC:.c=.o)
  3. BIN=processbar
  4. $(BIN):$(OBJ)
  5.     gcc -o $@ $^
  6. %.o:%.c
  7.     gcc -c $< -std=c99
  8.    
  9. .PHONY:clean
  10. clean:
  11.     rm -rf $(OBJ) $(BIN)
复制代码
process.h
  1. #pragma once                                                              
  2. #include<stdio.h>
  3. void process_v1();
  4. void FlushProcess(double total, double current);
复制代码
process.c
  1. #include"process.h"
  2. #include<string.h>
  3. #include<unistd.h>
  4. #define NUM 101
  5. #define STYLE '#'
  6. void FlushProcess(double total, double current)
  7. {
  8.     char buffer[NUM];
  9.     memset(buffer, 0, sizeof(buffer));
  10.     const char* lable = "|/-\";
  11.     int len = strlen(lable);
  12.     //不需要循环,只需填充#
  13.     int num = (int)(current * 100 / total);
  14.     for (int i = 0; i < num; i++)
  15.     {
  16.         buffer[i] = STYLE;
  17.     }
  18.     static int cnt = 0;
  19.     cnt %= len;
  20.     double rate = current * 100 / total;
  21.     printf("[%-100s][%.1f%][%c]\r", buffer, rate, lable[cnt]);
  22.     cnt++;
  23.     fflush(stdout);
  24. }
  25. void process_v1()
  26. {
  27.     char buffer[NUM];
  28.     memset(buffer, 0, sizeof(buffer));
  29.     const char* lable = "|/-\";
  30.     int len = strlen(lable);
  31.     int cnt = 0;
  32.     while (cnt <= 100)
  33.     {
  34.         printf("[%-100s][%d%][%c]\r", buffer, cnt, lable[cnt % len]);
  35.         fflush(stdout);
  36.         buffer[cnt] = STYLE;
  37.         cnt++;
  38.         usleep(500);
  39.     }
  40.     printf("\n");
  41. }
复制代码
main.c
  1. #include"process.h"
  2. //函数指针
  3. typedef void (*callback_t) (double total, double current);
  4. double total = 1024.0;  //文件大小
  5. double speed = 1.0;     //下载速度
  6. //回调函数
  7. void DownLoad(callback_t cb)
  8. {
  9.     double current = 0;
  10.     while (current <= total)
  11.     {
  12.         cb(total, current);
  13.         //下载代码
  14.         usleep(3000); //充当下载数据
  15.         current += speed;
  16.     }
  17.     printf("\ndownload %.2lfMB Done\n", current);
  18. }
  19. void UpLoad(callback_t cb)
  20. {
  21.     double current = 0;
  22.     while (current <= total)
  23.     {
  24.         cb(total, current);
  25.         //上传代码
  26.         usleep(3000); //充当上传数据
  27.         current += speed;
  28.     }
  29.     printf("\nupload %.2lfMB Done\n", current);
  30. }
  31. int main()
  32. {
  33.     DownLoad(FlushProcess);
  34.     UpLoad(FlushProcess);
  35.    
  36.     return 0;
  37. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表