【Linux项目自动化构建工具 make/Makefile】

news2024/11/29 22:32:58

目录

1 背景

2 原理

3 Linux第一个小程序-进度条

3.1 行缓冲区概念 

3.2 进度条代码

4 总结


1 背景

在VS中我们知道当我们想要运行程序时直接按f5程序就会自动运行起来,但是在Linux中如果有多个文件好像并不能这样快速进行,那么这时候就提出了Linux项目自动化构建工具 make/Makefile,用这个工具来管理我们的项目就会显得更加方便高效。


2 原理

我们先来看看这个究竟是个啥?

我们首先创建一个hello.c的C文件,向里面写入代码,然后再用gcc编译执行,有了前一篇博客介绍程序的翻译过程我们不难知道想要将C代码转换成可执行文件要进行预处理,编译,汇编,链接的过程(忘了的老铁可以去看看这篇文章gcc/g++的使用). 假如我们想要一步一步执行的话就必须一次一次的敲指令,那现在有什么比较方便的方法吗?答案是有的,这里就可以用make/Makefile.

(注意:接下来我写的这种方法实际中一般都不会这么写,而是直接用gcc全部翻译,我这里这样写是为了大家能够更好的理解make/Makefile)

我们首先创建一个Makefile的文件夹,用vim打开向里面写入:

  1 hello:hello.o
  2   gcc hello.o -o hello
  3 hello.o:hello.s
  4   gcc -c hello.i -o hello.o
  5 hello.s:hello.i
  6   gcc -S hello.i -o hello.s 
  7 hello.i:hello.c
  8   gcc -E hello.c -o hello.i
  9 
 10 .PHONY:clean
 11 clean:                                                                                                                                  
 12   rm -rf  hello.i hello.s hello.o hello

这里我们在介绍为啥要这么写?

hello:hello.o 这一行代表着依赖关系,然后换行回车后要再按一个tab键,这是语法规定。

然后在这一行写上依赖方法。

 那下面的clean前面又是什么鬼呢?

clean 这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要 make 执行。即命令 ——“make clean” ,以此来清除所有的目标文件,以便重编 译。 但是一般我们这种clean 的目标文件,我们将它设置为伪目标 , .PHONY 修饰 ,伪目标的特性是,总是被执行的。那前面我们不加.PHONY的文件就是不总是被执行的文件,这一点大家很容易理解。
现在我们只需要执行:make 
程序就会自动执行下面的指令,make clean 程序就会自动清理这些创建出的文件。
[grm@VM-8-12-centos lesson4]$ ll
total 8
-rw-rw-r-- 1 grm grm  76 Jan  7 15:11 hello.c
-rw-rw-r-- 1 grm grm 226 Jan  7 15:50 Makefile
[grm@VM-8-12-centos lesson4]$ make
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s 
gcc -c hello.i -o hello.o
gcc hello.o -o hello
[grm@VM-8-12-centos lesson4]$ ll
total 48
-rwxrwxr-x 1 grm grm  8360 Jan  7 15:50 hello
-rw-rw-r-- 1 grm grm    76 Jan  7 15:11 hello.c
-rw-rw-r-- 1 grm grm 16878 Jan  7 15:50 hello.i
-rw-rw-r-- 1 grm grm  1504 Jan  7 15:50 hello.o
-rw-rw-r-- 1 grm grm   451 Jan  7 15:50 hello.s
-rw-rw-r-- 1 grm grm   226 Jan  7 15:50 Makefile
[grm@VM-8-12-centos lesson4]$ ./hello
hello Makefile
[grm@VM-8-12-centos lesson4]$ make clean
rm -rf  hello.i hello.s hello.o hello
[grm@VM-8-12-centos lesson4]$ ll
total 8
-rw-rw-r-- 1 grm grm  76 Jan  7 15:11 hello.c
-rw-rw-r-- 1 grm grm 226 Jan  7 15:50 Makefile
make 是如何工作的 , 在默认的方式下,也就是我们只输入 make 命令。
1. make 会在当前目录下找名字叫 “Makefifile” “makefifile” 的文件。
2. 如果找到,它会找文件中的第一个目标文件( target ),在上面的例子中,他会找到 “hello” 这个文件,并把这个文件作为最终的目标文件。
3. 如果 hello 文件不存在,或是 hello 所依赖的后面的 hello.o 文件的文件修改时间要比 hello 这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成 hello 这个文件。
4. 如果 hello 所依赖的 hello.o 文件不存在,那么 make 会在当前文件中找目标为 hello.o 文件的依赖性,如果找到则再根据那一个规则生成 hello.o 文件。(这有点像一个堆栈的过程)
5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 hello.o 文件,然后再用 hello.o 文件声明make 的终极任务,也就是执行文件 hello 了。
6. 这就是整个 make 的依赖性, make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功, make 根本不理。
8. make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

当我们使用make指令后,不清理,在使用make指令就会出现下面这种情况:

 这时操作系统就会提醒我们hello已经是最新的了,但是我们如果打开hello.c修改一下里面内容,就又可以用make指令啦,但是依旧只能够用一次:

 那有什么办法不修改就可以运行的吗?

答案是有的:

 touch +文件名,就会将文件更新成最新的时间。

最后说明:

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

3 Linux第一个小程序-进度条

在这之前我问大家一个问题:换行和回车是一回事吗?

相信在很多人的印象中都会回答说是的,但是却不是这样的。换行是换到了下一行,但是光标所在的位置依旧是与上一行所对齐的,而回车是让光标回到本行开头。

3.1 行缓冲区概念 

大家先来看看这么一个程序:

#include <stdio.h>
int main()
{
 printf("hello Makefile!\n");
 sleep(3);
 return 0;
}

当我们运行的时候:

 我们不难发现程序是先打印出来的字符串然后sleep了3s才结束。

但是当我们去掉字符串中\n时再来运行:

 我们可以看见:

 这里会先sleep3s再打印字符串的。为什么呢?原因就是\n会刷新我们的行缓冲区。

3.2 进度条代码

这里直接给出代码,相信大家能够看懂

  1 #include<stdio.h>
  2 #include <unistd.h>
  3 #include <string.h>
  4 int main()
  5 {
  6  int i = 0;
  7  char bar[102];
  8  memset(bar, 0 ,sizeof(bar));
  9  const char *lable="|/-\\";
 10  while(i <= 100 ){
 11  printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
 12  fflush(stdout);
 13  bar[i++] = '#';
 14  usleep(50000);                                                                                                                         
 15  }
 16  printf("\n");
 17  return 0;
 18 }
我们运行起来看看:

 这样一个简单的进度条就制作完成啦!


4 总结

本篇博客我们总结了Linux项目自动化构建工具 make/Makefile简单的使用,还用动图展示了行缓冲区如何刷新,最后还写了一个简单的进度条。如果该文对你有帮助的话能不能一键3连支持一下呢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程接入(远程办公)解决方案 OpenText™ Exceed™ TurboX (ETX)

OpenText™ Exceed™ TurboX 安全快速的虚拟应用程序和桌面解决方案&#xff0c;适用于混合工作环境&#xff0c;只需低带宽互联网连接即可为办公桌面和图形要求苛刻的软件提供卓越的用户体验。 突出优势&#xff1a; 支持混合云环境使用任何设备随时随地远程工作为用户提供类…

SpringCloud之Zuul路由网关

Zuul路由网关1. Zuul的概念2. Zuul的作用3. 案例1. Zuul的概念 Zuul包含了对请求的路由&#xff08;用来跳转的&#xff09;和过滤两个最主要功能&#xff1a; 其中路由功能负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础&#xff0c;而过滤…

新年新故事 | Nice 兔 Meet U

各位伙伴新年好哇 比特熊又回来啦【比特熊故事汇2.0】23年开年第一场与大家一起认识“印象中”的不寻常开发人产品创新实践、工作 Mix 生活、反差感2023年1月12日19:00-20:00【比特熊故事汇2.0】新年想见你第一面Nice 兔 Meet U 比特熊兔年特别限定手办2023年兔年来到&#xff…

Ubuntu10.04编译libevent记录

目前有一个旧的程序 基于很老的ubuntu1004的系统做开发 很多新的C11什么的都用不了 之前 很多在ubuntu1804 上编译的so库 直接拿到1004上来用 提示报错 如下 没办法 只能重新在ubuntu 1004 上面编译了 记录下 下载libevent之后解压 直接执行./configure 提示报错如下图 …

kettle简单的ETL抽取同步两个库之间的数据

kettle下载安装 kettle下载&#xff0c;提取码为 1qyd 安装后&#xff0c;把连接数据库需要的jar包放到 data-integration\lib 目录下&#xff0c;到时候kettle才能正确连接数据库。 sqlserver需要的jar包&#xff0c;提取码为 6a6qmysql需要的jar包&#xff0c;提取码为 n8…

深入理解CAS

目录深入理解CASCAS中的引入什么是CAS&#xff1f;CAS原理——Unsafe类CAS优点CAS缺点ABA问题解决ABA问题深入理解CAS CAS中的引入 我们知道我们使用Volatile可以保证可见性&#xff0c;但不保证原子性&#xff0c;那么&#xff0c;如果我们不使用Lock锁和synchronized&#x…

机器学习之XGBoost模型学习

1.划分数据集函数train_test_split以及数据的加载&#xff1a; python机器学习 train_test_split()函数用法解析及示例 划分训练集和测试集 以鸢尾数据为例 入门级讲解_侯小啾的博客-CSDN博客_train_test_split 还有这篇文章&#xff0c;解析的清除&#xff1a; https://com…

2022 年度中国时序数据应用创新奖公布,涉及工业互联网、车联网等多个行业

随着新兴技术的快速发展&#xff0c;越来越多的企业开始以技术的融合创新来推动业务的数字化智能化转型&#xff0c;其中也诞生了很多成功的应用实践案例。2023 年 1 月 9 日&#xff0c;北京涛思数据科技有限公司(TAOS Data) 正式公布「2022 年度中国时序数据应用创新奖」获奖…

【路径规划】基于D星算法实现栅格地图机器人路径规划

目录算法介绍栅格地图代码运行效果算法介绍 A* 在静态路网中非常有效&#xff08;very efficient for static worlds&#xff09;&#xff0c;但不适于在动态路网&#xff0c;环境如权重等不断变化的动态环境下。 D是动态A&#xff08;D-Star,Dynamic A Star&#xff09; 卡内…

nodejs 如何实现自动化部署?

什么是自动化部署 我接触到的自动化部署概念最早是在 Vercel 上提供的&#xff0c;Vercel 可以提供和 github 联动的功能&#xff0c;通过和你自己的 github 上的某个库建立‘链接’&#xff0c;当你 commit 到 github 远程库时就可以自动部署&#xff0c;Vercel 会帮你完成以…

腾龙健康冲刺A股上市:计划募资10亿元,彭学文家族色彩浓厚

近日&#xff0c;广州腾龙健康实业股份有限公司&#xff08;下称“腾龙健康”&#xff09;预披露招股书&#xff0c;准备在深圳证券交易所主板上市。 本次冲刺上市&#xff0c;腾龙健康计划募资10.13亿元&#xff0c;其中4.09亿元用于水疗按摩池配件生产基地升级项目&#xff0…

数据可视化做出的个人年终总结报告,高颜值更高更具说服力

年终总结与个人业绩、晋升、加薪、离职或留任密切相关。聪明人利用年终报告来总结自己的成就和获得资源&#xff0c;领导者也可以从年终报告看出员工的成长和变化。例如我用可视化互动平台&#xff0c;智能分析做出的公司年终总结报告&#xff0c;高颜值高说服力&#xff0c;领…

Java异常的分类和注意点

异常体系结构 Error与Exception Error是程序无法处理的错误&#xff0c;它是由JVM产生和抛出的&#xff0c;比如OutOfMemoryError、ThreadDeath等。这些异常发生时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;一般会选择线程终止。 Exception是程序本身可以处理的异常…

国内外BI数据分析工具做报表有多大区别?

有什么样的土壤就会早就什么样的产品。国内外企业对报表的不同需求导致了国内外BI数据分析工具做表格时的巨大差异&#xff0c;这也是很多时候国外BI数据分析工具在中国水土不服&#xff0c;遭遇口碑体验两极化的一大原因。下面就来简单看看国内外BI数据分析工具做表格时的不同…

【前端】Vue项目:旅游App-(10)city:以indexBar的形式显示数据

文章目录目标过程与代码分析数据并展示封装到一个组件添加indexBar样式修改优化tab栏的切换效果总代码修改或新增的文件common.csscity.vuecurrentGroupCity.vuemain.js目标 上一篇显示了服务器中的数据&#xff1a;【前端】Vue项目&#xff1a;旅游App-&#xff08;9&#xf…

(九)devops持续集成开发——jenkins流水线发布一个docker版的前端vue项目

前言 本节内容主要介绍如何使用jenkins的流水线发布一个docker版的前端项目。关于本节内容中使用到的jenkins的组件&#xff0c;请参考往期博客内容&#xff0c;自行安装。我们使用NodeJS完成前端项目的编译安装&#xff0c;使用ssh组件完成编译后工程的传输&#xff0c;以及d…

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导

Allegro如何快速复制铜皮到其它层面的两种方法详细操作指导 在做PCB设计的时候,通常需要复制一个做好的铜皮到其它层面,如下图 需要把L3层的铜皮复制到其它的内层 Allegro支持快速将铜皮拷贝到其它层,下面介绍两种方法,具体操作如下 方法一 选择Edit

快速生成100万条数据并存入mysql数据库(1):游戏人物数据

最近正在一直苦恼如果去获取更多的数据以用来进行后期的查询和进行测试&#xff0c;发现了Navicat这个不错的宝藏&#xff0c;他可以一下子根据你数据库里面创建的各种各样的字段和约束创建出各种各样你自己想要的大量数据&#xff0c;当然这些数据非真实数据而是虚拟数据&…

Swin Transformer原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;CV攻城狮入门VIT(vision transformer)之旅——近年超火的Transformer你再不了解就晚了&#xff01; CV攻城狮入门VIT(vision transformer)之旅——VIT原…

Nacos多级服务存储模型, NacosRule负载均衡规则入门

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 NacosRule负载均衡规则 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 ♨️如…