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.outmaketest.cpp存在一种依赖关系,即前者需要通过后者生成,而第二行的g++ maketest.cpp -o mk.out -std=c++11指令,则是与之对应的依赖方法。

原理

make到底是如何工作的呢?

  1. make会在当前目录下找名字叫做”Makefile"或“makefile”的文件
  2. 如果找到,它会找文件中的第一个目标文件,在上面的例子中它会找mk.out,并把这个文件作为最终的目标文件。
  3. 如果目标文件不存在,或是目标文件所依赖的后面的文件修改时间要比目标文件新,那么,他就会执行后面所定义的命令来生成这个最终目标文件。
  4. 如果目标文件(mk.out)所依赖的文件(maketest.cpp)不存在,那么make会在当前文件中找到目标的依赖性吗。如果找到则再根据那一个文件再生成一个文件。(这里有点像一个堆栈的过程)
  5. 这就是整个mak的依赖性,make会一层一层地区找文件地依赖关系,直到最终编译出第一个目标文件。
  6. 在寻找过程中,如果出现错误,比如最后被依赖地文件找不到,那么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
Logo

更多推荐