makefile
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程得能力,makefile带来的好处就是–自动化编译,一旦写好,只需要一个make指令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令。make是一条命令,makefile是一个文件,两个搭配使用完成项目自动化构建。
举个例子:
// 程序代码
#include<iostream>
using namespace std;
int main()
{
cout << "hello word"<endl;
return 0;
}
makefile文件中的内容
mk.out:maketest.cpp
g++ maketest.cpp -o mk.out -std=c++11
.PHONY:clean
clean:
rm -f mk.out
依赖关系
在上面的makefile文件中,mk.out
和maketest.cpp
存在一种依赖关系,即前者需要通过后者生成,而第二行的g++ maketest.cpp -o mk.out -std=c++11
指令,则是与之对应的依赖方法。
原理
make到底是如何工作的呢?
- make会在当前目录下找名字叫做”Makefile"或“makefile”的文件
- 如果找到,它会找文件中的第一个目标文件,在上面的例子中它会找
mk.out
,并把这个文件作为最终的目标文件。- 如果目标文件不存在,或是目标文件所依赖的后面的文件修改时间要比目标文件新,那么,他就会执行后面所定义的命令来生成这个最终目标文件。
- 如果目标文件(
mk.out
)所依赖的文件(maketest.cpp
)不存在,那么make会在当前文件中找到目标的依赖性吗。如果找到则再根据那一个文件再生成一个文件。(这里有点像一个堆栈的过程)- 这就是整个mak的依赖性,make会一层一层地区找文件地依赖关系,直到最终编译出第一个目标文件。
- 在寻找过程中,如果出现错误,比如最后被依赖地文件找不到,那么make会直接退出,并报错,而对于所定义地命令地错误,或是编译不成功,make根本不理。
项目清理
- 工程是需要被清理的
- 像上面的clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即执行命令——
make clean
,以此来清楚所有的目标文件,一边重新编译。- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用
.PHONY
修饰,伪目标的特性是,总是被执行的
Linux第一个小程序-进度条
回车和换行的概念
回车:
\r
本义是光标重新回到本行开头,r英文return换行:
\n
本义是光标往下一行(不一定到下一行的首行),n的英文newline
缓冲区的概念
我们来看看两个相似代码的执行结果有什么区别。
#include<stdio.h>
#incldue<unistd.h>
int main()
{
printf("hello makefile");
sleep(3); // 等待三秒钟
return 0;
}
执行结果
可以看到,上面的代码是先将输出的信息打印到屏幕上,然后再等待3秒钟。那么我们看看下面的代码。
#include<stdio.h>
#include<unitstd.h>
int main()
{
printf("hello makefile");
sleep(3);
return 0;
}
从结果可以看出,在打印的时候没有进行换行操作时,程序是先等待三秒,等程序执行完之后,再把要输出的信息打印到屏幕上
接着我们看第三个代码
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello makefile");
fflush(stdout); // 把缓冲区数据强制写入到指定的地方
sleep(3);
return 0;
}
可以看到,这次虽然没有换行,但是程序也是先将要输出的信息打印到显示器上然后再休眠三秒钟。这是因为我们使用了fflush函数,强制的将缓冲区的信息打印到了显示器上。同样的换行符\n
也是有这样的功能的,在要输出的信息后面加上一个换行符,执行之后缓冲区就会将换行符之前的数据都先输出。而没有换行符的输出语句,要在缓冲区满或程序执行结束后再输出。
进度条代码
2 #include<string.h>
3 #include<unistd.h>
4 int main()
5 {
6 int i = 0;
7 char bar[102];
8 char sign[5] ="\\|-/"; // 用来模拟进度条后面的圈圈
9 while(i <= 100)
10 {
11 printf("[%-100s][%d%%]%c\r",bar,i,sign[i%4]); // 因为是回车,所以每次都是从行首开始打印
12 fflush(stdout);
13 bar[i] = '#';
14 bar[i+1] = '\0';
15 ++i;
16 usleep(10000);
17 }
18 printf(" \n");
19 return 0;
20 }
Git三板斧
将代码放到下载好的目录中
git add [文件名]
提交改动到本地
git commit .
最后的“ . ”表示当前目录
同步到远端服务器上
git push