【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)
目录
- 【Linux工具】编译器、调式器、项目自动化构建工具以及git的使用2(make/makefile和git的基本使用)
- 背景
- make和makefile的用法示例
- 依赖关系
- 依赖方法
- 原理
- 项目清理
- 使用git命令行
- 安装git
- 创建新的仓库
- 对远程仓库进行克隆
- git add
- git commit
- git push将代码文件推送到远端
- git其他操作
作者:爱写代码的刚子
时间:2023.7.7
前言:本篇博客主要介绍项目自动化构建工具make/makefile和git的基本使用,后面将会继续介绍他们的进阶使用,总结不易,希望能够支持刚子。下篇博客将会介绍gdb调试。
背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条指令,而makefile是一个当前目录下的一个文件,两者搭配使用,完成项目自动化构建。
make和makefile的用法示例
-
首先创建一个test.c的文件
-
再创建makefile文件
-
使用vim编辑makefile文件
第一行表示文件之间的依赖关系,第二行表示依赖方法 -
使用vim编辑test文件
-
直接使用make指令会生成test可执行程序
-
使用make clean会删除test这个可执行程序文件
依赖关系
- vim makefile编辑依赖关系
只要依赖关系不变,代码的顺序是可以变的。
依赖方法
- make使用make执行依赖方法
当缺少某个文件时,make会自动执行重新生成对应的文件
【问题1】对一个项目为什么不能多次使用make?
问题现象:
【解释】:因为没有必要,如果项目很大的话,如果文件已经是最新的话,重复执行make将会耗费时间,且没什么收益。
【附加问题1】:make如何识别文件是否已经是最新的呢?
答:
- 首先一定是源文件形成可执行程序,先有源文件才有可执行文件。一般而言,源文件的修改时间一定要比可执行文件要老。
- 如果我们更改了源文件,历史上曾经还有可执行文件,那么源文件的最近修改时间,一定要比可执行程序要新。
如何知道谁新谁老?
只需比较可执行程序和源文件的最近修改时间。 - .exe新于.c,源文件是老的,不需要重新编译。
- .exe老于.c,源文件是新的,需要重新编译。
【附加问题2】:一般而言,.exe的最近修改时间会等于.c的吗?
答:
一般不会,除非使用特殊命令强行修改。 - stat + 文件名字显示文件的最近修改时间
这里我的iTerm设置了中文,如果是英文的话:
Access:表示最近访问时间,如cat、vim、增删查改等操作都表示访问。
Modify:表示最近对文件内容修改的时间。
Change:表示最近对文件属性修改的时间。
例如:更改文件大小也会改变文件属性。
-
Access由于更改的频率的频率较高,更新的情况要写进磁盘中,当多人对磁盘进行操作时,而磁盘是外设,效率将会变得非常低,不利于Linux整机效率的提高。所以最新的Linux对Access的更改策略变为了根据Modify和Change的更新的次数和最近更新的文件的它里面维护的一个计数器来决定是否更改。
-
touch 文件名将文件的所有时间改为最新
-
touch -m 文件名将文件Modify时间改为最新的同时也将Change的时间改为最新
-
touch -a 文件名将文件Access时间改为最新的同时也将Change的时间改为最新
然后将时间转为时间戳进行比较文件的新旧。(比较Modify的最近修改时间)
验证演示:
更改文件的时间,使其能够再次编译:
-
时刻注意:文件 = 文件内容 + 文件属性
【问题2】当clean放在makefile文件开头时为什么只会执行clean?
问题现象:
【解释】:make会自上向下扫描makefile,将要形成的第一个文件充当为make的默认动作。所以我们建议将clean动作放在下面。
总结:
make会自动推导makefile中的依赖关系
推导的过程是一种栈式结构
make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译!不一定总是执行。
如果我们想要让项目文件使用make指令时总是执行如何做到?
答:可以将文件设置成伪目标文件(但是我们不建议将要形成的目标文件设置成伪目标文件)
.PHNOY修饰的文件,后面的命令将总是被执行。
原理
make是如何进行工作的呢?
- make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
- 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,
并把这个文件作为最终的目标文件。 - 如果test文件不存在,或是test所依赖的后面的test.o文件的文件修改时间要比test这个文件新(可
以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。 - 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果
找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程) - 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明
make的终极任务,也就是执行文件hello了。 - 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
件。 - 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
而对于所定义的命令的错误,或是编译不成功,make根本不理。 - make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作了。
项目清理
- 工程是需要清理的
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行, 不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
建议将清理这类工作设置成伪目标。
【附加1】:还可以将test写成$@ 将test.c写成 $^
【附加2】:如果不想让命令在make的时候显示出来我们可以在命令前带@
使用git命令行
安装git
在linux上输入yum install git指令(需要root权限)
创建新的仓库
对远程仓库进行克隆
- git clone +仓库地址将远端仓库进行克隆
注意名字不要带前面的@
git add
利用cp指令将需要push的文件拷贝到当前仓库目录:
- git add .或者git add +文件将仓库没有的文件添加到仓库的暂存区
git commit
注意日志部分一定要详细写,要写准确一点。
第一次使用git可能会遇见以下问题:
【解决办法】:
输入提示的指令,并填入自己的邮箱和姓名,因为gitee可能要对代码进行溯源。
git push将代码文件推送到远端
git其他操作
- git log查看提交记录
- git status查看提交状态
免密码提交教程链接
- 编辑.gitignore文件,提交时不会提交含有该后缀的文件
这里我添加了.p和.pp后缀,提交时将忽略含有该后缀的文件。
注意后缀前面的*不能少!!!