2.Linux项目自动化构建工具-make/Makefile
2.1 概念
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一
种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
2.2 初次见面
2.3 依赖关系和依赖方法
什么是依赖关系?举个生活中例子:我们都有自己的家庭,家庭成员有爸爸和妈妈,那么我是他们的儿子,作为儿子,我们在上学期间,我们的学费、生活费什么的费用都靠的是爸爸来出,我们依赖于自己的爸爸,这就是依赖关系。什么是依赖方法呢?同样,我们在上高中的时候,每个月可能是回到家里找爸爸要钱或者是不回去打电话给爸爸要钱,那么我们不管是怎么样要钱,在爸爸面前要钱的时候都会说:爸,下个月没有生活费给我点生活费。其中这句话中,爸这个字就是依赖关系,然后后面的话就是依赖方法,==只有依赖关系和依赖方法同时存在才能完成程序。==假如我向同学的爸说这句话那就不能完成这个要到生活费这个事情。假如我对我爸只是说了声爸,后半句没有说,那么也是不能完成这件事情的。
同样的在上面图中Makefile文件中写的程序中的myfile:myfile.c这段代码中,myfile就依赖于myfile.c,这段代码下面的gcc -o myfile myfile.c就是依赖关系对应的依赖方法。==明白了依赖关系那么Makefile文件也就是一个围绕依赖关系和依赖方法的一个自动化编译的工具。==下面根据预处理、编译、汇编、链接四个阶段来理解依赖:
2.4 make原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。
make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
如果找到,它会找文件中的第一个目标文件(target),在上图中,他会找到“myfile”这个文件,并把这个文件作为最终的目标文件。
make解释Makefile文件的底层算法就是用的栈结构
2.5 项目清理
依赖关系中,目标文件对应的依赖文件列表可以是空,验证:
make指令执行的时候默认是从上到下扫描时,默认只会执行第一组目标文件的依赖关系和依赖方法,什么意思?看实例:
.PHONY:总是被执行的。什么意思呢?看下面现象:
上述图中的现象是make多次后提示说myfile以最新的了。那么当我们带上.PHONY呢?
这就是.PHONY这个语法的现象观察后的作用,也就是对目标文件的依赖关系对应的依赖方法总是执行。
**上面没做.PHONY处理的,使用make指令后,make提示此文件是最新的了,那么make是怎么知道是最新的呢?**验证:(stat指令是查看文件状态)
其实,make指令检查的是源文件和目标文件的时间,如果源文件时间在目标文件时间前(也就是源文件要旧一些),再次make就会提示此文件是最新的;如果源文件时间在目标文件时间后(也就是源文件要新一些),再次make就会执行相对应的指令。如下:(touch既可以创建文件,也可以更新文件时间)
[yinhan@VM-12-12-centos _stu]$ ll total 20 -rw-rw-r-- 1 yinhan yinhan 75 Jan 7 20:44 Makefile -rwxrwxr-x 1 yinhan yinhan 8360 Jan 7 20:44 myfile -rw-rw-r-- 1 yinhan yinhan 74 Jan 7 20:38 myfile.c [yinhan@VM-12-12-centos _stu]$ make make: `myfile' is up to date. [yinhan@VM-12-12-centos _stu]$ make make: `myfile' is up to date. [yinhan@VM-12-12-centos _stu]$ stat myfile File: ‘myfile’ Size: 8360 Blocks: 24 IO Block: 4096 regular file Device: fd01h/64769d Inode: 790070 Links: 1 Access: (0775/-rwxrwxr-x) Uid: ( 1001/ yinhan) Gid: ( 1001/ yinhan) Access: 2023-01-07 20:44:35.505555881 +0800 Modify: 2023-01-07 20:44:35.182552590 +0800 Change: 2023-01-07 20:44:35.182552590 +0800 Birth: - [yinhan@VM-12-12-centos _stu]$ stat myfile.c File: ‘myfile.c’ Size: 74 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 790069 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ yinhan) Gid: ( 1001/ yinhan) Access: 2023-01-07 20:38:54.831086646 +0800 Modify: 2023-01-07 20:38:54.828086616 +0800 Change: 2023-01-07 20:38:54.828086616 +0800 Birth: - [yinhan@VM-12-12-centos _stu]$ touch myfile.c [yinhan@VM-12-12-centos _stu]$ stat stat: missing operand Try 'stat --help' for more information. [yinhan@VM-12-12-centos _stu]$ stat myfile.c File: ‘myfile.c’ Size: 74 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 790069 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1001/ yinhan) Gid: ( 1001/ yinhan) Access: 2023-01-07 20:53:17.489869168 +0800 Modify: 2023-01-07 20:53:17.415868416 +0800 Change: 2023-01-07 20:53:17.415868416 +0800 Birth: - [yinhan@VM-12-12-centos _stu]$ make gcc -o myfile myfile.c [yinhan@VM-12-12-centos _stu]$
3.sudo配置
首先先看一下没有配置的情况:
[yinhan@VM-12-12-centos _stu]$ sudo ls [sudo] password for yinhan: yinhan is not in the sudoers file. This incident will be reported. [yinhan@VM-12-12-centos _stu]$
3.1 理解sudo
sudo指令使用的时候为什么要输入自己的密码呢?sudo的功能的是以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。既然是这样的功能,为什么不是输入root的密码呢?那么我们sudo一下就是以root身份执行指令,那么这里root不就是没有意义嘛,那为什么需要sudo呢?
首先没有配置sudo,那么sudo+命令是不能执行的,为什么?因为该用户不在信任列表中。这里就可以理解为什么sudo使用时输入自己的密码,原因就在于该用户是值得信任的用户才能使用,不是信任用户是不可使用的,会提示。
3.2 sudo配置
进入到sudoers文件中对其进行更改就OK了。
sudoers文件在哪里?
[yinhan@VM-12-12-centos _stu]$ ls -al /etc/sudoers -r--r----- 1 root root 4363 Nov 2 10:32 /etc/sudoers //拥有者和所属组都是root [yinhan@VM-12-12-centos _stu]$
怎么配置?
1.使用su命令切换成root用户
2.进入/etc/sudoers并编辑,使用vim /etc/sudoers
3.一直翻到最低层,看到这样的(如图示)
4.退出底行模式下使用wq!指令(因为是系统级配置文件所以修改需要慎重,所以必须强制修改即可)