【操作系统】Liunx项目自动化构建工具-make/Makefile

Yan-英杰的主页

悟已往之不谏 知来者之可追

C++程序员,2024届电子信息研究生


目录

一、背景

二、Makefile

实现

Makefile依赖

依赖关系

makefile的工作原理

项目清理

补充:

.PHONY是什么?

Linux如何进行多行注释:

说明:

三、Linux小程序(进度条)

四、使用git命令行

五、git三板斧

下载项目到本地

[三板斧第一招: git add](#三板斧第一招: git add)

[三板斧第二招: git commit](#三板斧第二招: git commit)

[三板斧第三招:git push](#三板斧第三招:git push)


一、背景
会不会写makefifile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefifile带来的好处就是------"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefifile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一种在工程方面的编译方法。make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建。

二、Makefile

实现

C代码

cpp 复制代码
#include <stdio.h>
int main()
{
     printf("hello Makefile!\n");
     return 0;
}

Makefifile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i

Makefile依赖

cpp 复制代码
.PHONY:clean
clean:
 rm -f hello.i hello.s hello.o hello

依赖关系

上面的文件 hello ,它依赖 hell.o
hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c

makefile的工作原理

① make命令会在当前目录下找到名字叫 "Makfile"或"makefile"的文件------>②首先
找到,第一个目标文件,在上面的例子中,他会先找到hello这个文件,并把这个文件作为最
终文件------> ③ 如果hello文件不存在,或者是hello所依赖的hello.o这个文件的修改时间要比
hello.o这个文件行,那么他就会执行后面所定义的命令来生成hello这个文件------> ④ 如果
hello所依赖hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如
果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)------> ⑤ 当然,
你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明
make的终极任务,也就是执行文件hello了。 ------> ⑥ 这就是整个make的依赖性,make会
一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。 ------> ⑦ 在找寻的过
程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而
对于所定义的命令的错误,或是编译不成功,make根本不理。 ------> ⑧ make只管文件的依
赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在

项目清理

像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会
被自动执行, 不过,我们可以显示要make执行。即命令------"make clean",以此来清除所有
的目标文件,以便重编译。但是一般我们这种clean的目标文件,我们将它设置为伪目标,用
.PHONY 修饰,伪目标的特性是,总是被执行的。可以将我们的 hello 目标文件声明成伪目
标,测试一下

补充:

.PHONY是什么?

.PHONY是一个伪目标,
可以防止在Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,另一种是提交执行makefile时的效率。

Linux如何进行多行注释:

1.ESC退出到命令模式

2.ctrl+v 切换到可视化模式

3.HJKL挪动光标位置

4.shift+i输入//

5.再按ESC即可,进行多行注释

说明:

(1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。
(2)伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。
(3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标
例如:

cpp 复制代码
.PHONY clean

clean:
        rm -rf *.o 

使make命令会自动绕过隐含规则搜索过程 ,也就是说执行命令make clean会自动忽略名

**为"clean"文件的存在,**因此声明.PHONY配置项会改善性能,并且不需要担心实际同名文件存在

与否。

三、Linux小程序(进度条)

依赖关系:Makefile

cpp 复制代码
processbar: main.c processBar.c
    gcc -o $@ $^
.PHONY:clean
clean:
    rm -f processbar

processBar.h

cpp 复制代码
#pragma once
#include<stdio.h>
#include<string.h>
#include<unistd.h>
extern void processbar();

processBar.c

cpp 复制代码
#include "processBar.h"
  
 void processbar()
 {
     int i = 0;
     char bar[102];
     memset(bar, 0 ,sizeof(bar));
     const char *lable="|/-\\";
    
    while(i <= 100)
    {
      printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
      fflush(stdout);
      bar[i++] = '#';
      usleep(10000);
    }
    
    printf("\n");
    
}   

四、使用git命令行

背景:

Git属于分散型版本管理系统,是为版本管理而设计的软件。

Linux的创始人Linus Torvalds在2005年开发了Git的原型程序。当时,由于在Linux内核开发中使用的既有版本管理系统的开发方许可证发生了变更,为了更换新的版本管理系统,Torvalds开发了Git。

Linux内核的更新速度在全世界也算首屈一指。因此,势必需要一个功能强、性能高的版本管理系统来提高开发速度。

在当时的开源环境下,虽然已经有数款版本管理软件被开发出来,但功能和性能都差强人意。加之Git是由Linus Torvalds亲自着手开发的,可以说在功能与性能方面无可挑剔。程序员们愿意接受Git,很大程度上取决于这个背景。

五、git三板斧

注:在做这些操作之前要先有个gitee或github的账号

下载项目到本地

创建好一个放置代码的目录.
这里的 url 就是刚刚建立好的 项目 的链接 .

三板斧第一招: git add

cpp 复制代码
  git clone https://www.xxxx.com/xxxxxx

将代码放到刚才下载好的目录中
将需要用 git 管理的文件告知 git

三板斧第二招: git commit

提交改动到本地
最后的 "." 表示当前目录
提交的时候应该注明提交日志, 描述改动的详细内容 .
报错:

当遇到commit提交时,git命令无法识别,提交人的身份应该如何解决这种问题

cpp 复制代码
//修改默认邮箱和账户

git config --global user.email "[email protected]"

git config --global user.name "Yan-英杰"

三板斧第三招:git push

同步到远端服务器上

cpp 复制代码
git push

同步到远端服务器上
需要填入用户名密码. 同步成功后 , 刷新 Github 页面就能看到代码改动了

相关推荐
宁zz20 小时前
乌班图安装jenkins
运维·jenkins
工业通讯探索者20 小时前
ProfiNet转CANopen协议转换网关驱动新能源汽车生产线多轴同步控制
自动化·工业物联网·协议转换网关·网关模块·总线协议
大丈夫立于天地间20 小时前
ISIS协议中的数据库同步
运维·网络·信息与通信
cg501721 小时前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影21 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain21 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon21 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu1 天前
ubuntu中使用安卓模拟器
android·linux·ubuntu
小马哥编程1 天前
【软件测试】自动化测试结合 CI/CD有哪些方案
自动化·集成测试·测试覆盖率