Linux--gcc与make

文章目录

  • gcc/g++的使用
    • 背景知识
    • gcc与g++
    • gcc的编译过程
      • 预处理
      • 编译
      • 汇编
      • 链接
  • 函数库
  • 自动化构建工具--make
    • 三个时间
    • 伪目标文件
    • 其他表示方法
    • mybin的推导过程

gcc/g++的使用

背景知识

GCC是一个开源的编译器套件,支持多种编程语言,并提供了广泛的语言特性和标准库支持。可在各种操作系统中运行。
GCC具有强大的代码优化能力,可以对生成的机器代码进行各种优化,以改善程序的性能。

编译过程:GCC的编译过程主要包括预处理、编译、汇编和链接几个阶段。

下面我们会对这几个过程展开论述;

gcc与g++

g++是gcc中专门用于编译C++代码的命令。实际上也是GCC的一个别名,只是g++默认将源文件视为C++代码进行编译,并启用C++相关的特性和标准库;GCC默认将源文件视为C代码进行编译。

gcc的编译过程

编译格式:

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

预处理

gcc的预处理是编译过程的第一步,主要完成:
在这里插入图片描述

宏展开:处理所有宏定义,并将宏调用处替换为相应的内容;
头文件展开:将所有#define 指令包含的文件插入到该指令位置,以便在编译时能够使用被包含文件中的定义和声明。
条件编译:处理所有的条件预编译指令,如#if、#endif、#else等,根据条件判断是否编译相应的代码块。
添加行号和文件名标识:在编译后的文件中添加行号和文件名标识,方便调试时定位错误。

指令:gcc –E [要编译的文件] –o [生成的目标文件]

在这里插入图片描述
我们可以查看下test.i:
在这里插入图片描述

编译

经过预处理过程后,就会将预处理后的文件编译成汇编语言代码了。

指令:gcc -S [源文件] -o [目标文件]

在这里插入图片描述
我们可以查看该文件的内容:汇编语言代码
在这里插入图片描述

汇编

gcc将汇编代码转换成机器语言指令(二进制代码),并生成目标文件。

指令:gcc -c [源文件] -o [目标文件]

在这里插入图片描述

查看二进制文件:将会是一堆字符
在这里插入图片描述

链接

gcc将各个目标文件和库文件进行链接,生成可执行文件或动态链接库。

指令:gcc [源文件] -o [可执行文件]

在这里插入图片描述

这里涉及到一个重要的概念:函数库

函数库

函数库是一种预先编写好的可重复使用的代码模块集合,通常包含了常用的函数、数据结构、算法等,像我们在C程序中总会包含一个<stdio.h>一样,包含了输入输出的相关函数;

函数库分为两种类型:

静态数据库:静态数据库在编译链接时被完整地复制到可执行文件中,成为可执行文件的一部分。当应用程序运行时,静态数据库的代码会被加载到内存中并直接执行。优点是执行速度快,但缺点是会增加可执行文件大小。

动态数据库:动态数据库在编译链接时只保留函数的引用,而不将库函数的代码复制到可执行文件中。当应用程序运行时,需要使用动态库函数的函数时,系统会根据函数的引用从动态函数库中加载相应的代码并执行。优点是节省了可执行文件的空间,但缺点是稍微降低了执行速度。

一般默认生成的文件调用的都是动态链接库
blog.csdnimg.cn/10f90b7a775b4198a81acb6b69614b14.png)

若想调用静态库

在这里插入图片描述
在这里插入图片描述

自动化构建工具–make

make是一种常见的自动化构建工具,用于管理软件项目的编译、测试和部署等任务。make工具基于一个名为makefile的文件,其中包含一系列规则和依赖关系,指定了如何从源代码生成可执行文件或其他目标文件。

要执行该操作,需要先创建一个makefile名的文件(文件名不可改),然后在这个文件内进行编辑:
在这里插入图片描述

依赖关系:用于描述目标文件和依赖文件之间的关系;当makefile执行时,会通过目标文件,使用对应的依赖方法;
依赖方法:用于指定生成目标文件的命令。可以使用各种编译器和工具链的命令来编译、链接和生成目标文件。

在Linux对应目录下,执行命令make,就能执行:
在这里插入图片描述

清除操作
在这里插入图片描述

这里要注意:
在这里插入图片描述

三个时间

查看文件时间属性:stat [文件名]
在这里插入图片描述

在Linux系统中,每个文件都有三个与时间相关的属性,分别是:

Access:表示文件最后一次被访问的时间戳。当文件被读取、执行、或者作为输入给某个程序时,访问时间会被更新。
Modify:文件最后一次被修改的时间戳。当使用编辑器修改文件内容时,修改时间会更新。
Change:代表的是文件属性最后一次被改变的时间戳。当文件的属性进行修改时,更改时间会更新。

所以make会判断执行文件是不是最后一次被更新了,若没被更新,则不需执行依赖方法的命令。

在这里插入图片描述

伪目标文件

在这里插入图片描述
通过该指令,执行make指令时,就不会被限制;
这是在makefile中定义的一种特殊目标,它不代表实际的文件,而是用来表示一个动作或任务
伪目标文件通常用于定义一些不生成文件的操作和指令。常用于清理临时文件、安装和卸载文件的目标文件上。

其他表示方法

在这里插入图片描述
在这里插入图片描述

mybin的推导过程

在这里插入图片描述

  1. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文
    件。
  2. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
    而对于所定义的命令的错误,或是编译不成功,make根本不理。
  3. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,

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

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

相关文章

C++入门学习(4)引用 (讲解拿指针比较)

上期回顾 在学习完函数重载之后&#xff0c;我们可以使用多个重名函数进行操作&#xff0c;会发现C真的是弥补了好多C语言的不足之处&#xff0c;真的不禁感概一下&#xff0c;时代的进步是需要人去做出改变的&#xff0c;而不是一味的使用啊&#xff01;所以我们今天继续学一下…

674. 最长连续递增序列 718. 最长重复子数组 1143.最长公共子序列 1035.不相交的线

674. 最长连续递增序列 题目&#xff1a; 给定一个未经排序的整数数组nums&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 dp数组含义&#xff1a; dp[i]&#xff1a;以下标i为结尾的连续递增的子序列长度为dp[i]。 递推公式&#xff1a; 怎么…

3D RPG Course | Core 学习日记四:鼠标控制人物移动

前言 前边我们做好了Navgation智能导航地图烘焙&#xff0c;并且设置好了Player的NavMeshAgent&#xff0c;现在我们可以开始实现鼠标控制人物的移动了。除了控制人物移动以外&#xff0c;我们还需要实现鼠标指针的变换。 实现要点 要实现鼠标控制人物移动&#xff0c;点击…

Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的&#xff0c;因为我们还处于开发阶段 当我们完成具体任务开发后&#xff0c;就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs&#xff0c;现在的web服务通常都是基于liunx操作系统…

虹科示波器 | 汽车免拆检测 | 2017款路虎发现车行驶中发动机抖动且加速无力

一、故障现象 一辆2017款路虎发现车&#xff0c;搭载3.0L发动机&#xff0c;累计行驶里程约为3.8万km。车主反映&#xff0c;车辆在行驶过程中突然出现发动机抖动且加速无力的现象&#xff0c;于是请求拖车救援。 二、故障诊断 拖车到店后首先试车&#xff0c;发动机怠速轻微抖…

Unity地面交互效果——5、角色足迹的制作

大家好&#xff0c;我是阿赵。   之前几篇文章&#xff0c;已经介绍了地面交互的轨迹做法。包括了法线、曲面细分还有顶点偏移。Shader方面的内容已经说完了&#xff0c;不过之前都是用一个球来模拟轨迹&#xff0c;这次来介绍一下&#xff0c;怎样和角色动作结合&#xff0c…

深入浅出理解ResNet网络模型+PyTorch实现

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;Identity Mappings in Deep Residual Networks 论文&#xff1a;Deep Residual Learning for Image Recognition ResNet详解PyTorch实现 PyTorch官方实现ResNet 【pytorch】ResNet18、ResNet20、…

文件夹重命名:解决文件夹名称难题,批量将中文翻译成英文

在日常生活和工作中&#xff0c;我们经常需要处理各种各样的文件和文件夹。然而&#xff0c;有时候我们会遇到文件夹名称混乱或者无法识别的问题&#xff0c;这给我们的文件管理和查找带来了很大的不便。为了解决这些问题&#xff0c;我们可以使用文件夹批量重命名技巧&#xf…

strtok函数详解:字符串【分割】的利器

目录 一&#xff0c;strtok函数简介 二&#xff0c;strtok函数的用法 三&#xff0c;strtok函数的注意事项 一&#xff0c;strtok函数简介 strtok函数可以帮助我们将一个字符串按照指定的分隔符进行分割&#xff0c;从而得到我们想要的子字符串。 &#x1f342;函数头文件&am…

前端工程化(vue脚手架安装)

用命令行安装&#xff0c;先安装NodeJs&#xff0c;配置环境变量 1.npm config set prefix "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Node.js" //引号内路径是NodeJs安装所在路径 2.npm config get prefix 查看其是否成功 3.npm install -g vue/cli 4…

MySQL数据库入门到大牛_05_排序ORDER BY与分页LIMIT

文章目录 1. 排序数据1.1 排序规则1.2 单列排序1.3 多列排序 2. 分页2.1 背景2.2 实现规则2.3 拓展 3. 第五章练习 1. 排序数据 1.1 排序规则 如果没有使用排序操作&#xff0c;默认情况下&#xff0c;查询返回的数据是按照添加数据的顺序显示。例如&#xff1a;在淘宝中可以…

【Vue】组件封装小技巧 — 利用$attrs和v-bind接收传递未定义的属性

使用介绍 在Vue.js中&#xff0c;$attrs 和v-bind可以用于组件的二次封装&#xff0c;以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码&#xff1a; 假设你有一个名为MyButton的自定义按钮组件&#xff0c;它接受一些…

14.序列化和文件的输入/输出 保存对象

14.1 保存对象状态 你已经奏出完美的乐章&#xff0c;现在会想把它储存起来。你可以抓个文房四宝把它记下来&#xff0c;但也可以按下储存按钮(或按下File菜单上的Save)。然后你帮文件命名&#xff0c;并希望这个文件不会让屏幕变成蓝色的画面。 储存状态的选择有很多种&…

域名解析DNS:如何查询txt类型的解析记录

前言 略 查询txt类型的解析记录 使用 nslookup 命令查询。 示例&#xff1a; cmd> nslookup -qttxt _acme-challenge.mydomain.com 服务器: UnKnown Address: fe80::1非权威应答: _acme-challenge.mydomain.com text "_unitrust-dcv2311071423492fmnwb1w…

07 # 手写 find 方法

find 的使用 find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 9];var result arr.find(fun…

第七讲:利用类事件改变对象的属性(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

矿泉水除溴酸盐、矿泉水除溴化物的技术

我们常饮用的各品牌的矿泉水&#xff0c;实际在生产过程当中也涉及到了相当复杂的处理工艺的&#xff0c;今天为大家分享的是关于矿泉水中溴酸盐、溴化物的知识点&#xff0c;以及矿泉水中为什么要除溴酸盐&#xff1f;原理是什么&#xff0c;那么又是什么样的技术能真正从根本…

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

华为防火墙基本原理工作方法总结

防火墙只会对tcp首包syn建立会话表&#xff0c;其它丢掉&#xff0c;如synack&#xff0c;ack udp直接建立会话表 icmp只对首包请求包建立会话表&#xff0c;其它包&#xff0c;如应答的不会建立直接丢掉 防火墙状态查看&#xff1a; rule name trust_untrust source-zone tru…