目录
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
进度条原理
- 了解回车,换行:
\r为回车, \n为换行
- 回车:光标重新回到本行开头
- 换行:光标前往下一行(不一定到下一行行首)
在C语言中\n是换行+回车
2. 了解缓存区
说明了: 打印的信息一定存在某个位置———这个位置就是存在了缓存区里面
**fflush函数:**强制刷新缓存区到stdout(屏幕)
- 进度条原理
进度条的实现
//要放大窗口再执行,才有进度条的效果
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 }