【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现

文章目录

  • 1.gcc编译过程
    • 1.1预处理
    • 1.2编译
    • 1.3汇编
    • 1.4链接
  • 2.自动化构建工具-make和makefile
    • 2.1使用背景
    • 2.2两者的概念和区别
    • 2.3项目清理
  • 3.Linux简单进度条的实现

1.gcc编译过程

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

在这里插入图片描述

1.1预处理

  预处理(Preprocessing):在这个阶段,gcc会对源代码进行预处理,主要包括处理宏定义、头文件包含、条件编译等操作。预处理器会根据预处理指令(以#开头)对源代码进行处理,并生成一个经过预处理的中间文件。

  格式 gcc [选项] 要编译的文件 [选项] [目标文件]

  实例: gcc –E test.c –o test.i

  选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

  选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

在这里插入图片描述

1.2编译

  编译(Compilation):在这个阶段,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc会将预处理后的中间文件转换为汇编代码。它会进行词法分析、语法分析、语义分析等操作,生成相应的汇编代码文件(通常以.s或.asm为扩展名)。

  用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

  实例: gcc –S test.i –o test.s

在这里插入图片描述

1.3汇编

  汇编(Assembly):在这个阶段,gcc会将汇编代码转换为机器码或可执行的二进制文件。它会调用系统上的汇编器(如gas)将汇编代码转化为目标文件(通常以.o为扩展名)。

  实例: gcc –c test.s –o test.o

在这里插入图片描述

1.4链接

  链接(Linking):在这个阶段,gcc会将目标文件和其他必要的库文件进行链接,生成最终的可执行文件。链接器(如ld)会解析目标文件中的符号引用,将它们与其他目标文件或库文件中的符号定义进行匹配,并生成最终的可执行文件。

  实例: gcc test.o –o test

在这里插入图片描述
  代码即可编译成功。
在这里插入图片描述

2.自动化构建工具-make和makefile

2.1使用背景

  当然一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,每个文件多有相对应的规则去执行,一些文件需要先编译,一些文件需要后编译,也可能一些文件需要重新编译,甚至于进行更复杂的功能操作。

  对此引入了makefile来定义了一系列的规则来指定文件所对应的编译需求

  makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。而make是一个命令工具,是一个解释makefile中指令的命令工具
  

2.2两者的概念和区别

  在Linux中,make是一个构建工具,而makefile是用于描述和指导make工具进行构建过程的文件。

  (1)make的概念:make是一个命令行工具,旨在自动化构建软件的过程。 它根据指定的构建规则和依赖关系,判断哪些文件需要重新编译,并执行相应的构建命令进行编译和链接。make会读取makefile文件来获取构建规则和命令。

  (2)makefile的概念:makefile是一个文本文件,包含了构建软件的规则、依赖关系和构建命令。 它告诉make工具如何进行构建,定义了目标、依赖关系和构建命令之间的关联。通过编写合适的makefile文件,可以实现对项目的自动化构建。

  (3)两者的区别:make是一个构建工具,提供了命令行接口来执行构建操作,而makefile则是一个文本文件,用于描述构建规则和命令。 make工具根据makefile文件中的规则和依赖关系,进行自动化构建,而makefile文件本身并不具备执行构建的能力。

  make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

1.什么是依赖规则

  依赖规则(Dependency rules)是在makefile中定义的规则,用于描述一个目标和其所依赖的文件之间的关系。依赖规则告诉make工具,在构建目标之前,需要先检查并更新相关的依赖文件。

  一个简单的依赖规则通常包括三个部分:目标、依赖和命令。

target: dependency1 dependency2
    command1
    command2

  在这个例子中,我们定义了两个依赖规则:

  对于目标hello,它依赖于hello.o目标文件。如果hello.o不存在或者比hello的生成时间要早,那么make工具会执行后续的构建命令将hello.o编译链接成可执行文件hello。

  对于目标hello.o,它依赖于hello.c源文件。如果hello.c不存在或者比hello.o的生成时间要晚,那么make工具会执行后续的构建命令将hello.c编译成目标文件hello.o。

hello: hello.o
    gcc hello.o -o hello

hello.o: hello.c
    gcc -c hello.c -o hello.o

  
2.什么是依赖关系

  依赖关系(Dependency relationships)是指一个软件系统或项目中,各个组件或模块之间的相互依赖关系。在软件开发中,依赖关系描述了一个组件或模块在实现或运行过程中所依赖的其他组件或模块。

hello: hello.o                      //文件 hello ,它依赖 hell.o
    gcc hello.o -o hello             

hello.o: hello.s                    //hello.o , 它依赖 hello.s
    gcc -c hello.s -o hello.o          

hello.s: hello.i                    //hello.s , 它依赖 hello.i
    gcc -S hello.i -o hello.s

hello.i: hello.c                    //hello.i , 它依赖 hello.c
    gcc -E hello.c -o hello.i

  对于第一条目标hello,它依赖于hello.o目标文件。如果hello.o不存在或者比hello的生成时间要早,那么make工具会执行后续的构建命令将hello.o链接成可执行文件hello。后面三条同理。
  

2.3项目清理

  工程是需要被清理的,对于使用使用构建系统提供的清理目标(makefile):通常会提供清理目标以辅助清理工作。Makefile中可以定义一个名为clean的目标,其命令中包含删除生成文件的操作。通过运行make clean命令,将执行所定义的清理任务。

  但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

  用make和makefile实现hello world!

makefile
  $@指前一项文件hello   $^指后一项文件hello.c

在这里插入图片描述

hello world!
在这里插入图片描述

执行成功
在这里插入图片描述

删除成功
在这里插入图片描述

3.Linux简单进度条的实现

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
	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");
	return 0;
}

在这里插入图片描述
这些就是Linux中gcc编译、make和makefile的简单介绍了😉
如有错误❌望指正,最后祝大家学习进步✊天天开心✨🎉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NX】NXOpen::BlockStyler::Tree的个人使用类分享

网上关于NXOpen::BlockStyler::Tree的例子不是太多&#xff0c;控件默认id名称为tree_control01&#xff0c;因为例子不多很多功能得自己写&#xff0c;虽然NXOpen::BlockStyler::Tree的封装已经不错了&#xff0c;但是实际使用起来也不是很方便&#xff0c;比如像获取所有节点…

【Git】 Git初相识

文章目录 1. Git的必要性1.1 提出问题1.2 解决问题1.3 注意事项 2. Git的安装2.1 kali下的安装2.3 Windows下的安装 3. Git的配置 1. Git的必要性 1.1 提出问题 在我们的学习或者工作中&#xff0c;经常会遇到一些比较难搞的上司或者老师&#xff0c;让我们交上去的文档改了又…

【UI设计】新拟态风格

新拟态风格 1.有且只有一个光源照射 那作者在追波上按钮也好还是卡片处理也好&#xff0c;仔细观察不难发现&#xff0c;它定了一个光源&#xff0c;是从左上向右下照射的&#xff0c;所以&#xff0c;越靠近光源的部分&#xff0c;越亮&#xff0c;远离光源的越暗&#xff08;…

Linux进程OOM-kill 监控和规避

目录 一、proc目录简介 二、Linux OOM机制说明 1、OOM killer机制 2、寻找系统中最先被OOM kill的进程 3、修改 oom_score_adj 一、proc目录简介 proc是linux系统中的一个虚拟文件系统&#xff0c;它实际上不含有任何真正的文件&#xff0c;/proc中的文件如同linux内核中的…

Elasticsearch Dump的详细安装和迁移es索引和数据的使用教程

前言 如果希望将数据导出到本地文件而不是通过编程方式处理&#xff0c;可以考虑使用Elasticsearch的导出工具&#xff0c;如Elasticsearch Dump&#xff08;Elasticdump&#xff09;或Elasticsearch Exporter。这些工具可以将Elasticsearch索引中的数据导出为可用于后续处理的…

通付盾发布UIAM白皮书,利用区块链、大模型AI,以及无证书分布式身份认证赋能工业互联网

简介 UIAM白皮书结合各行业与国内外IAM发展状况&#xff0c;对IAM发展历程、核心能力以及现代增强型IAM技术的演进路线进行探讨。探索身份和信息安全管理与区块链、大模型AI、无证书分布式身份认证等技术趋势&#xff0c;以及UIAM技术在工业互联网的应用。期望能够帮助企业组织…

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

mysql的两种安装方式(yum在线安装和通用二进制)

文章目录 msqly的安装一、yum在线安装二、通用二进制安装mysql msqly的安装 一、yum在线安装 yum是一种在线安装方式&#xff0c;通过官网网址在linux下载安装 首先是配置一个yum安装源 yum install http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm也…

使用Jetpack Compose中的LazyRow

在Jetpack Compose中&#xff0c;我们可以使用LazyRow来创建一个水平滚动的列表&#xff0c;类似于传统Android开发中的HorizontalScrollView。在这篇博客中&#xff0c;我们将探讨如何在Jetpack Compose中使用LazyRow。 创建LazyRow 要创建一个LazyRow&#xff0c;我们需要创…

旧手机不要轻易扔掉,将其设置为无线网卡,不消耗流量

如果你有一部旧手机正在闲置着&#xff0c;或者正考虑要将其丢弃&#xff0c;那么请暂停一下。因为这个旧手机可以成为你的无线网卡&#xff0c;帮助你在家中或出行时实现更快的网络下载速度&#xff0c;而且毫不费流量。接下来&#xff0c;我将告诉你如何将旧手机变成无线网卡…

idea中如何过滤某些文件不提交

文章目录 前言设置.gitignore文件解决方案 设置新的忽略文件具体步骤如下 常用过滤文件 前言 在开发过程中&#xff0c;经常会遇到一些文件是我们不想提交的内容。那么应该如何过滤掉&#xff1f;不去提交到我们的git仓库&#xff1f; 比如&#xff0c;我们常用的一些配置文件…

01_面向对象的设计原则

面向对象的设计原则 参考资料&#xff1a; 视频书籍 《设计模式&#xff1a;可复用面向对象软件的基础》 简介 面对复杂问题如何解决&#xff1f; 分解&#xff1a;分而治之&#xff0c;大问题分解成小问题。抽象&#xff1a;忽视非本质的细节&#xff0c;处理泛化和理想化…

卷积神经网络--猫狗系列之下载、导入数据集

(由于是学习&#xff0c;所以文章会有一些报错及解决办法) 在Kaggle()获取数据集&#xff1a;&#xff08;没有账号先去注册一个账号&#xff0c;在注册时可能会出现的问题见Kaggle注册出现一排“Captcha must be filled out.”&#xff01;&#xff09; https://www.kaggle.…

人工智能在航天领域中有哪些应用?

随着科技的不断进步&#xff0c;人工智能已经成为各个领域中的重要驱动力。在航天领域中&#xff0c;人工智能的应用正日益展现出巨大的潜力。航天领域对精确性、自动化和高效性的需求&#xff0c;使得人工智能成为实现这些目标的关键技术之一。人工智能正在以其独特的优势和算…

Linux中Docker详细安装说明

1.准备环境 说明&#xff1a;准备Linux系统centos7版本(以上) 2.切换管理模式 说明&#xff1a;输入一下命令&#xff0c;然后回车&#xff0c;输入密码。 su – 3.更新yum 说明&#xff1a;为了保证doker能够给顺利安装&#xff0c;那么更新一下&#xff1b;如果没有也可以…

【SpringMVC】| 报文信息转换器HttpMessageConverter

目录 框架搭建 报文信息转换器HttpMessageConverter 1. RequestBody注解 2. RequestEntity类型 3. RequestBody注解&#xff08;常用&#xff09; 重点&#xff1a;SpringMVC处理json 重点&#xff1a;SpringMVC处理ajax 重点&#xff1a;RestController注解 4. Respo…

day1-若依项目前后端分离的初步使用

响应式布局: 做好的产品能在pc端,手机,平板都能正常浏览 开发项目两种方式 1.自己从0开始写代码 2.在若依中下载拥有基础功能的源码 若依使用的mysql版本 mysql5.7 导入别人的项目如何操作 若依项目下载地址**:https://gitee.com/y_project/RuoYi-Vue.git** 可以使用揉…

AIPRM for ChatGPT 提示词模板扩展工具实践

&#xff08;1&#xff09;基本介绍 AIPRM for ChatGPT是一个Chrome浏览器扩展程序&#xff0c;基于Chromium内核开发的浏览器都可以使用该扩展&#xff0c;比如微软的Edge浏览器等。 在AIPRM的帮助下&#xff0c;我们可以在ChatGPT中一键使用各种专门为网站SEO、SaaS、营销、…

Transformer(四)--实现验证:transformer 机器翻译实践

转载请注明出处&#xff1a;https://blog.csdn.net/nocml/article/details/125711025 本系列传送门&#xff1a; Transformer(一)–论文翻译&#xff1a;Attention Is All You Need 中文版 Transformer(二)–论文理解&#xff1a;transformer 结构详解 Transformer(三)–论文实…

idea搭建springmvc

Spring MVC是一种基于MVC模式的框架&#xff0c;它是Spring框架的一部分。它提供了一种更简单和更有效的方式来构建Web应用程序。它提供了一系列的功能&#xff0c;可以帮助您更快地构建Web应用程序&#xff0c;如控制器&#xff0c;视图&#xff0c;模型&#xff0c;数据绑定&…