大家好,我是 兔7 ,一位努力学习C++的博主~
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
如有不懂,可以随时向我提问,我会全力讲解~
如果感觉博主的文章还不错的话,希望大家关注、点赞、收藏三连支持一下博主哦~!
你们的支持是我创作的动力!
我相信现在的努力的艰辛,都是为以后的美好最好的见证!
人的心态决定姿态!
本文章CSDN首发!
目录
0. 前言
1. 背景
2. 使用
2.1 依赖关系
2.2 原理
2.3 项目清理
3. Linux小程序-进度条
3.1 \r&&\n
3.2 行缓冲区概念
3.1 缓冲区
4. 进度条代码
5. 使用 git 命令行
5.1 下载项目到本地
5.1.1 三板斧第一招: git add
5.1.2 三板斧第二招: git commit
5.1.3 三板斧第三招: git push
5.2 配置免密码提交
如果你没听过或不会用 make/Makefile 就不要说你写过大项目!
此博客为博主以后复习的资料,所以大家放心学习,总结的很全面,每段代码都给大家发了出来,大家如果有疑问可以尝试去调试。
大家一定要认真看图,图里的文字都是精华,好多的细节都在图中展示、写出来了,所以大家一定要仔细哦~
感谢大家对我的支持,感谢大家的喜欢, 兔7 祝大家在学习的路上一路顺利,生活的路上顺心顺意~!
mytest:test.o
gcc test.o -o mytest
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
.PHONY:clean
clean:
rm -f test.i test.s test.o mytest
这就通过依赖关系生成了一系列文件:
当然这里就有一个小知识了,我们平时在一条命令行中只使用了一条命令,其实还可以执行多个命令,次序也是按照写的顺序去执行,接下来我就展示一下。
2.1 伪目标
这里说理论听了也不懂,我直接展示区别就好了:
也就是上面说的,伪目标总是被执行,而目标如果更新到最新,就不会重新进行编译。
其实将目标设置成伪目标也不是不可以,只是没有意义,如果已经是最新的了,那么就没必要再进行编译生成一份。
上面已经标记的很清楚了,也就是mytest的生成需要依赖下面的步。
但是实际中,我们其实不需要写这么多依赖关系。
但是在刚开始用的时候最好写全,因为只有你可以写全,你就可以很清楚的理解它们之间的依赖关系。
大家认为如果这样写是不是很简洁了,但其实还有更简洁的写法:
当然也可以写成下面这样,上面那样写是为了介绍清楚这里的所有用法:
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“mytest”这个文件,并把这个文件作为最终的目标文件。
- 如果hello文件不存在,或是hello所依赖的后面的test.o文件的文件修改时间要比mytest这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
- 如果hello所依赖的test.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)
- 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件mytest了。
- 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
- make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
- 工程是需要被清理的。
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
- 如果大家有兴趣可以将 mytest 目标文件声明成伪目标,测试一下。
- 回车概念
- 换行概念
大家看看下面的代码运行起来有什么区别:
有的小伙伴可能认为有区别,有的可能认为没有,接下来因为图片不是很好解释,我就图片加文字给大家解释清楚:
由此可见,加 '\n' 和不加 '\n' 的区别。
这时可能有小伙伴感觉很奇怪,我们开始学C语言的时候就知道,代码的执行是从上到下依次执行,那么这里既然等了3秒后再打印的,那么是不是先执行的sleep再执行的printf呢?
当然,不是!代码的执行是从上到下依次执行的,这点肯定没有问题,所以也肯定是先执行的printf后执行的sleep,至于为什么先等3秒后打印,这里就涉及到缓冲区的概念了。(当然你们也可以去VS编译器去试试,会有意外收获哦~)
那么我们要想看着是先打印再休眠3秒可不是不可以,我们可以手动刷新缓冲区:
那么最开始提到了 '\r' 这个是什么呢?
这个 '\r' 是回车,而 '\n' 则是回车换行。
1、 '\r' 是使光标回到旧行(当前行)的开头。
2、 '\n' 是回车+换行,也就是到当前行的下一行的开头。
那如果这里使用 '\r' 会是什么情况呢?
我们会发现,不仅没有先打印,而且到最后还不打印了。
使用了 '/r' 要是重新写入内容,会将这一行的内容进行覆盖式写入。
那么既然会覆盖式写入,那想想我们平时下载时的进度条,是不是与这个原理很相似?
在写进度条之前,我们先写一个简单的倒计时:
1 #include
2 #include
3
4 void Count()
5 {
6 int i = 9;
7 while(i)
8 {
9 printf("%d\r",i);
10 fflush(stdout);
11 sleep(1);
12 --i;
13 }
14
15 }
16
17 int main()
18 {
19 Count();
20 return 0;
21 }
由于博主不会使用gif动画(主要是我找到的gif动画需要会员,要不然他不给我用!),所以就不给大家演示了,这个的效果出来就是倒计时,大家下去可以去试试~
如果这样写的话,i大于9以后就会有问题,因为我们只是对第一个字符进行覆盖式写入,但是第二位的字符我们覆盖不到,所以就会出现问题,所以我们只要将打印的规则改为%2d(%-2d)就可以了,因为不足位数的会用空格代替。
1 #include
2 #include
3
4 void Count()
5 {
6 int i = 9;
7 while(i)
8 {
9 printf("%-2d\r",i);
10 fflush(stdout);
11 sleep(1);
12 --i;
13 }
14
15 }
16
17 int main()
18 {
19 Count();
20 return 0;
21 }
接下来就是写进度条了:
首先进度条要用符号来代替运行了多少,也要显示加载到了百分之多少,这两点是必备的。
还有一个就是如果进度条停止了,用户可能不知道是电脑死机了还是正在下载中,所以我们要设置一个标识,比方说:设计一个小风扇转圈。让用户知道是正在下载......
17 void ProcBar()
18 {
19 int i = 0;
20 char proc[102];
21 memset(proc,'\0',sizeof(proc));
22 const char* lable = "|/-\\";
23 while(i <= 100)
24 {
25 printf("[%-100s][%d%%][%c]\r",proc,i,lable[i%4]);
26 fflush(stdout);
27 proc[i] = '#';
28 usleep(100000);
29 i++;
30 }
31 printf("\n");
32 }
33
34 int main()
35 {
36 //Count();
37 ProcBar();
38 return 0;
39 }
当然这里还是给大家看不了动画版,大家有兴趣,自己下去写一写,然后去看一看,会很有意思的,然后我将运行完后的和运行中的截图了,大家凑合看一看~
创建好一个放置代码的目录。
git clone [url]
url 用http的网址,因为很方便使用。
git add [文件名]
将需要用 git 管理的文件告知 git
提交改动到本地
git commit -m '提交日志'
提交的时候应该注明提交日志, 描述改动的详细内容。
git push
需要填入用户名密码,也就是登录gitee或者github的账号和密码。
免密码登录
这里可以设置免密码登录,当然不是很推荐,因为可能时间一长机会忘记自己的密码,所以还是手动输入为好~
如上就是 Linux项目自动化构建工具-make/Makefile 的所有知识,如果大家喜欢看此文章并且有收获,可以支持下 兔7 ,给 兔7 三连加关注,你的关注是对我最大的鼓励,也是我的创作动力~!
再次感谢大家观看,感谢大家支持!