当前位置: 首页 > news >正文

linux-自动化构建工具与进度条程序的实现

背景

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

 进度条的实现

在完成进度条之前,需要会一个标识符,\n,能够将光标返回当前行的开始位置。

并且需要了解缓冲区的概念:

数据传入的的时候会暂时存在缓冲区当中,保证了不会频繁的传输。

如果想要让数据立即显示在屏幕上,需要用到函数fflush(),参数是数据流。

 实现进度条可以创建三个文件,分别是声明文件,功能实现文件,执行文件 

进度条代码:

test.c:

 #include"progress.h"
  2 int main(){
  3 progress(50000);
  4 return 0;
  5 }

progress.c:

#include"progress.h"
  2 void progress(int n){
  3 char arr[110] = {0};
  4 int cnt = 0;
  5 while(cnt<=100){
  6 printf("[%-100s][\%%%d]\r",arr,cnt);
  7 arr[cnt] = '-';
  8 cnt++;
  9 usleep(n);
 10 fflush(stdout);
 11 }
 12 printf("\n");
 13 return;
 14 }
progress.h:

 #include<stdio.h>
  2 #include<unistd.h>
  3 void progress(int n);

 

用进度条的代码来举例

test:test.c progress.c
  2         gcc -o $@ $^
  3 .PHONY:clean
  4 clean:
  5         rm -rf test
$@可以代表可执行文件,$^代表的是依赖文件。

 

自动化构建工具 

试例

#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
依赖关系
上面的文件 hello , 它依赖 hell.o
hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c
依赖方法
gcc hello.* - option hello.* , 就是与之对应的依赖关系
原理
make 是如何工作的 , 在默认的方式下,也就是我们只输入 make 命令。那么,
1. make 会在当前目录下找名字叫 “Makefile” “makefile” 的文件。
2. 如果找到,它会找文件中的第一个目标文件( target ),在上面的例子中,他会找到 “hello” 这个文件,
并把这个文件作为最终的目标文件。
3. 如果 hello 文件不存在,或是 hello 所依赖的后面的 hello.o 文件的文件修改时间要比 hello 这个文件新(可
以用 touch 测试),那么,他就会执行后面所定义的命令来生成 hello 这个文件。
4. 如果 hello 所依赖的 hello.o 文件不存在,那么 make 会在当前文件中找目标为 hello.o 文件的依赖性,如果
找到则再根据那一个规则生成 hello.o 文件。(这有点像一个堆栈的过程)
5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 hello.o 文件,然后再用 hello.o 文件声明
make 的终极任务,也就是执行文件 hello 了。
6. 这就是整个 make 的依赖性, make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,
而对于所定义的命令的错误,或是编译不成功, make 根本不理。
8. make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,
我就不工作啦。

 

项目清理
工程是需要被清理的
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,
不过,我们可以显示要 make 执行。即命令 ——“make clean” ,以此来清除所有的目标文件,以便重编
译。
但是一般我们这种 clean 的目标文件,我们将它设置为伪目标 , .PHONY 修饰 , 伪目标的特性是,总是被
执行的。
可以将我们的 hello 目标文件声明成伪目标,测试一下。

 


http://www.mrgr.cn/news/36831.html

相关文章:

  • 常用CSS选择器
  • Altium Designer创建接口类器件原理图库
  • docker笔记_数据卷、挂载
  • Goweb---Gorm操作数据库(三) 更新
  • Linux设备驱动中的异步通知与异步I/O学习s
  • 基于vue框架的大学生国内外竞赛参赛管理系统开发设计与实现xs3sb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • shell中对xargs命令传参进行编辑
  • 天命人,如何轻松利用仿真技术打造出属于你的“金箍棒”?
  • 前端插件开发用什么技术比较好,用来程序自动化下载
  • 微服务架构拆分策略与实践
  • git的远程操作-把自己的代码推上去和把别人的代码拉下来
  • 人工智能下的GIS发展趋势
  • GUI-文本和按钮控件
  • leetcode 2024.9.26
  • 神经网络介绍及其在Python中的应用(一)
  • 19.1 使用k8s的sdk编写一个项目获取pod和node信息
  • 小红书,努力成为小红书
  • UCS与Unicode:二虎相争,必有一伤?
  • 数字化AI直播革命:无人直播新纪元,真AI赋能未来!
  • 如何在 Android 中用 Kotlin 将 dp 转换为 px