Linux--gcc与make

news2024/11/26 5:55:15

文章目录

  • 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只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,

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

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

相关文章

真的设计师做图只需要一个炫云客户端就够了

真的设计师做图只需要一个炫云客户端就够了&#xff0c;为什么这么说呢&#xff1f;因为炫云的这个客户端功能真的太全了&#xff0c;设计师想要的功能在炫云客户端上都有&#xff0c;而且还很多功能是免费的&#xff0c;非常的实用&#xff0c;具体有哪些功能我们一起来看看吧…

无人机航迹规划:五种最新智能优化算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

一键批量转码:将MP4视频转为MP3音频的简单方法

随着数字媒体设备的普及&#xff0c;视频和音频格式转换的需求也越来越常见。其中&#xff0c;将MP4视频批量转换为MP3音频的需求尤为普遍。无论是为了提取视频中的背景音乐&#xff0c;还是为了在手机或电脑上方便地收听视频音频&#xff0c;这个过程都变得非常重要。接下来我…

数字滤波器设计---FIR 滤波器设计

数字滤波器设计---FIR 滤波器设计 FIR 滤波器与 IIR 滤波器的比较 与无限持续时间冲激响应 (IIR) 滤波器相比&#xff0c;具有有限持续时间冲激响应的数字滤波器&#xff08;全零或 FIR 滤波器&#xff09;既有优点又有缺点。 FIR 滤波器具有以下主要优点&#xff1a; 它们可…

Java中的反射机制

获取字节码文件对象的三种方式 1&#xff0c;&#xff08;常用&#xff09;源代码阶段&#xff0c;Class.forName("全类名") 2&#xff0c;&#xff08;传参&#xff09;加载阶段 类名.class 3&#xff0c;&#xff08;前提有对象&#xff09;运行阶段 对象.getClas…

LeetCode算法心得——全排列(回溯型排列)

大家好&#xff0c;我是晴天学长&#xff0c;排列型的回溯&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按…

外贸企业GMS认证|SD-WAN专线解决方案支持 IPv6、IPv4

IP地址是英文internet protocol的缩写&#xff0c;是网络之间互连的协议。互联网诞生后&#xff0c;很长一段时间都是使用v4版本的IP协议&#xff0c;也就是 IPv4 &#xff0c;目前全球使用互联网的人数达到了48.8亿&#xff0c;而IPv4的地址库总共约43亿个地址&#xff0c;每个…

CCLink转Modbus TCP网关_MODBUS报文配置

兴达易控CCLink转Modbus TCP网关是一种功能强大的设备&#xff0c;可实现两个不同通信协议之间的无缝对接。它能够将CCLink协议转换为Modbus TCP协议&#xff0c;并通过报文配置实现灵活的通信设置。兴达易控CCLink转Modbus TCP网关可以轻松实现CCLink和Modbus TCP之间的数据转…

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

2011年09月06日 Go生态洞察:Go语言的反射法则

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

STM32——STM32F4系统架构

文章目录 前言STM32F4XX系统架构 前言 本篇文章为STM32F4系列的系统架构&#xff0c;因为最近在学习F4的板子&#xff0c;暂时先更F4的&#xff0c;有需要F1的后续再更新。 主系统由 32 位多层 AHB 总线矩阵构成&#xff0c;可实现以下部分的互连&#xff1a; STM32F4XX系统架…

(自适应移动端)响应式门窗定制pbootcms板 门窗门业网站板下载-带视频功能

(自适应移动端)响应式门窗定制pbootcms模板 门窗门业网站模板下载-带视频功能 PbootCMS内核开发的网站模板&#xff0c;该模板适用于门窗门业网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应移动端&#xff0c;…

款网络拓扑自动扫描工具

Topology-Scanner是WeOps团队免费开放的一个网络拓扑自动扫描模块&#xff0c;可以自动发现网络设备的类型、网络设备之间的互联 使用方式 java -jar ./topology-scanner.jar --config_path./config/ 配置说明 1. 拓扑发现请求参数文件(request.json) ips [全网发现] 模式时…

2023/11/10 JAVA学习

取文件夹本身大小 打开文件 文件改名案例 输出流,文件依照你起的文件名自动创建 哪个流后创建,哪个流先关闭 虚拟机退出跑不了 finally别返回值

记一次上位机软件线程泄露的分析及解决

上位机软件在客户现场隔一段时间说操作了没反应&#xff0c;但是上位机又没死&#xff0c;出现了一些奇怪现象&#xff1a; 左上角的时间不走了&#xff08;本来是1s运行一次&#xff09;使用任务管理器查看&#xff0c;内存占用1.5G,线程有3000多个&#xff0c;正常情况下&am…

【chat】2:vs2022 连接远程ubuntu服务器远程cmake开发

大神们是使用vs远程连接和调试的:C++搭建集群聊天室(三):配置远程代码编辑神器 VScode我尝试过vs++ 和 clion 都不错。在 Visual Studio 中配置 Linux CMake 项目 比较麻烦的就是要配置CMakeSettings.json ,而且会自动做复制指定远程 Linux 目标,则会将源复制到远程系统 …

【K8s集群离线安装-kubeadm】

1、kubeadm概述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令快速完成一个kubernetes集群的部署。 2、环境准备 2.1 软件环境 软件版本操作系统CentOS 7Docker19.03.13K8s1.23 2.2 服务器 最小硬件配置&#xff1a;2核CPU、2G内存…

软件研发团队适用的项目管理工具推荐

Zoho Projects是一款专为大型产研团队设计的项目管理工具&#xff0c;它也是许多软件开发行业高速成长背后的生产线。与其他项目管理产品相比&#xff0c;Zoho Projects最大的不同之处在于其独特的流程设计。在软件上线初期&#xff0c;Zoho Projects能够有效地帮助软件研发公司…

xcorr函数的用法和程序举例

xcorr函数的用法和程序举例 xcorr函数返回两个离散时间序列的互相关。互相关测量向量 x 和移位&#xff08;滞后&#xff09;副本向量y 的之间的相似性&#xff0c;形式为滞后的函数。如果 x 和 y 的长度不同&#xff0c;函数会在较短向量的末尾添加零&#xff0c;使其长度与另…

代码随想录-广度优先搜索理论基础及相关习题

广度优先搜索理论基础 广搜的搜索方式就适合于解决两个点之间的最短路径问题。因为广搜是从起点出发&#xff0c;以起始点为中心一圈一圈进行搜索&#xff0c;一旦遇到终点&#xff0c;记录之前走过的节点就是一条最短路。 广搜是一圈一圈的遍历方式&#xff0c;如下图&#x…