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

这篇具有很好参考价值的文章主要介绍了【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.gcc编译过程

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

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

1.1预处理

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

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

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

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

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

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

1.2编译

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

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

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

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

1.3汇编

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

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

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

1.4链接

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

  实例: gcc test.o –o test

【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现,Linux,linux
  代码即可编译成功。
【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现,Linux,linux

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

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

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

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

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

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的概念与区别、Linux简单进度条实现,Linux,linux
这些就是Linux中gcc编译、make和makefile的简单介绍了😉
如有错误❌望指正,最后祝大家学习进步✊天天开心✨🎉文章来源地址https://www.toymoban.com/news/detail-523112.html

到了这里,关于【Linux】gcc编译过程、make和makefile的概念与区别、Linux简单进度条实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux 入门篇(三)】Vim、Gcc、Make、Makefile、Shell

    Linux系统都会自带vi编辑器,vim编辑器需要另外安装。 安装命令: sudo apt-get install vim 使用vi命令打开文件: vim test.c 1.1 一般模式 用vim打开一个软件以后自动进入到此模式。 1.2 编辑模式 一般模式中无法编辑文件,要编辑文件就要进入编辑模式,按下“i、I、a、A、o、O、s、

    2023年04月14日
    浏览(35)
  • Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

    目录 1、yum 1.1 查看软件包:  1.2 安装软件包 1.3 卸载软件 2、vim 2.1 vim的三种模式 2.2 vim的基本操作 2.3. vim正常模式命令集 2.3.1 插入模式 2.3.2 移动光标 2.3.3 删除文字 2.3.4 复制 2.3.5 替换 2.3.6撤销上一次操作 2.3.7 更改 2.3.8 跳至指定的行 2.4. vim末行模式命令集 3、gcc/g++ 3.1 预处理

    2024年02月10日
    浏览(46)
  • 【Linux】gcc/g++的使用 自动化构建工具make/makefile的使用

    在学习C语言时,我们了解了预处理阶段要做的事:-预处理 这其中会经历两个阶段: 编译和链接 而编译又分为三个阶段: 预编译,编译,汇编 通过不同的选项,可以让gcc停在以上相应的阶段。 这里有一个记忆的小窍门,我们 电脑左上角的Esc键 ,顺序刚好和上面的顺序一致

    2024年02月13日
    浏览(36)
  • Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

    1.在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 2.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包

    2024年01月17日
    浏览(49)
  • 【Linux】vim(附配置sudo)、yum、gcc、g++、gdb、make/Makefile工具汇总

    (一)历史沉淀 我们在安装一个软件之前,需要先下载对应的软件包,但是这个软件包并不存在于我们本地的计算机磁盘,而是存在于远端服务器上;那么计算机如何知道该软件存在于具体的哪一台服务器上呢? 对于电脑来说,我们一般通过搜索对应软件的官网来得到相应

    2024年02月13日
    浏览(48)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(53)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(51)
  • vim、gcc/g++、make/Makefile、yum、gdb

    vim有很多种模式,但此处只介绍3种,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。 要查看所有的模式可以打开vim,在底行模式中直接输入 :help vim-modes。 (1)正常/普通/命令模式(Normal mode) 进入vim后的默认模式,可以控制屏幕光标的移动、

    2024年02月08日
    浏览(46)
  • 【Linux】:Linux项目自动化构建工具——make/Makefile || Linux第一个小程序——进度条(简单版本)

    在本章开始给大家分享一个图片 希望对你有帮助 在这里插入图片描述 在开始本章之前 我们需要回顾一下上节课的函数的动静态库的优缺点 动态库的优点: 比较节省资源(这里说的资源不仅仅是磁盘资源 也包括网络资源 内存资源等等),不会出现太多的重复代码 缺点:对

    2024年02月05日
    浏览(44)
  • 编译正点原子kernel报错make: arm-linux-gnueabihf-gcc:命令未找到

    需要在 Makefile 添加完整路径内容: 解决办法:

    2024年02月02日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包