【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录

01.预处理(宏替换)

02.编译(生成汇编)

03.汇编(生成机器可识别码)

04.连接(生成可执行文件或库文件)

05.选项


编译器在编译代码时包含以下四个步骤:1.预处理 2.编译 3.汇编 4.连接 下面来一一介绍

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

01.预处理(宏替换)

编译器预处理阶段主要负责处理源代码中的预处理指令,其中包括宏替换。

预处理器

编译器预处理阶段由预处理器负责执行。预处理器负责源代码中以‘#’开头的预处理指令,例如‘#define’、‘#include’、‘#ifdef’等,并将它们转换为相应的代码。

宏替换

宏替换是与处理区的一项重要功能。在预处理阶段,编译器会执行宏替换,将源代码中的宏定义替换为其相应的内容。宏定义通常使用‘#define’指令定义,例如

#define PI 3.14159

在预处理阶段,编译器会将代码中所有出现的‘PI’替换成‘3.14159’。

宏参数

宏定义可以嗲有参数,这样可以创建参数化的宏。例如:

#define MAX(x, y) ((x) > (y) ? (x) : (y))

宏展开

预处理器在进行宏替换时会执行宏展开,即将宏调用替换成宏定义的内容,在进行宏展开时,会递归地展开嵌套的宏调用,直到没有更多的宏调用为止。

实例

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

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

02.编译(生成汇编)

在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

词法分析

也称扫描器,它负责将源代码分解成单词,去除空白字符和注释。通常使用有限状态自动机或正则表达式来实现。

语法分析

也称解析器,它负责将词法分析器生成的单词流转换成抽象语法树。这个阶段检查语法错误,确保代码符合语言规范。

语义分析

语义分析器检查源代码中的语义错误,如类型不匹配、未声明的变量等。它还负责构建符号表以及执行类型推断等任务。

优化

在生成目标代码之前,编译器通常会对中间表示进行有害,以提高程序的性能和效率。优化技术包括常量折叠、循环展开、死代码删除等。

代码生成

在这个阶段,编译器将优化后的中间表示转换成目标机器的汇编代码或机器码。这个过程通常包括指令选择、寄存器分配、指令调度等步骤。

实例

选项-S:进行编译,生成汇编代码,并停止汇编过程。

03.汇编(生成机器可识别码)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件

语法分析

在语法分析阶段,编译器会将源代码转换为中间表示形式,通常是抽象语法树或者中间代码。这个过程包括词法分析和语法分析。

词法分析器负责将源代码分解为单词或者标记,去除空格、注释等不必要的字符。

代码生成

代码生成阶段将中间表示形式转换为目标机器能够识别的汇编代码或者机器码。这个阶段包括指令选择、寄存器分配、指令调度等过程。

指令选择负责将中间表示的操作转换为目标机器的指令序列。寄存器分配则是将变量分配到寄存器或者内存位置,以最小化访存操作。指令调度会对指令序列进行重新排列,以优化执行顺序,提高指令级并行度和流水线利用率。

实例

选项-c:将汇编代码转化为二进制目标代码

04.连接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。

实例

输入./对程序进行执行

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

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有函数的定义,那么“printf”函数是哪里实现的呢?

事实上:系统把这些函数实现都被做到名为lib.so.6的库文件中去了,在没有特别指定时,gcc会到系统默认的搜索路径“/user/lib”下进行查找,也就是链接到lib.so.6库函数中区,这样就能实现函数“printf”了,而这也就是链接的作用

函数库分为静态库及动态库:

  1. 静态库

    • 静态库是一组预编译的目标文件的集合,这些目标文件中包含了函数的实现和数据。
    • 静态库的文件扩展名通常为 .a(在Unix/Linux系统中)或 .lib(在Windows系统中)。
    • 当你使用静态库时,编译器会将库文件的代码复制到可执行文件中,使得可执行文件变得更大。这意味着可执行文件中包含了静态库中的所有函数和数据,使得可执行文件变得更加独立。
  2. 动态库

    • 动态库是一组预编译的目标文件的集合,与静态库不同的是,它们在程序运行时被动态加载到内存中。
    • 动态库的文件扩展名通常为 .so(在Unix/Linux系统中)或 .dll(在Windows系统中)。
    • 使用动态库可以减小可执行文件的大小,并且可以在运行时动态地加载和卸载库文件。这使得动态库在系统资源使用和代码更新方面更加灵活。

05.选项

除了以上的四个,gcc还有很多选项:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

-S  编译到汇编语言不进行汇编和链接

-c  编译到目标代码

-o 文件输出到 文件

-static 此选项对生成的文件采用静态链接

-g 生成调试信息。GNU 调试器可利用该信息。

-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

-O0

-O1

-O2

-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

-w  不生成任何警告信息。

-Wall 生成所有警告信息。

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

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

相关文章

MongoDB启动报错

spring boot 引入MongoDB启动报错 java.lang.IllegalStateException: Failed to introspect Class [io.micrometer.core.instrument.binder.mongodb.DefaultMongoConnectionPoolTagsProvider] from ClassLoader [sun.misc.Launcher$AppClassLoader18b4aac2] at org.springfra…

爬虫综合案例-获取房源信息并在地图上显示

文章目录 1.项目介绍2.项目分析3.爬取房源信息4. 导入高德地图5.地图上显示房源信息6.运行程序 1.项目介绍 本次案例将从 58 同城信息网爬取相关城市的房源出租信息,然后通过高德地图把房源信息地图显示,通过地图进行浏览,点击相应的热点文字…

[运维] 可视化爬虫易采集-EasySpider(笔记)

一、下载 ​下载地址 下滑到Assets页面,选择下载 二、解压运 ​解压压缩包,打开文件夹 在此文件夹下打开Linux Terimal, 并输入以下命令运行软件: ./easy-spider.sh 注意软件运行过程中不要关闭terminal。 三、使用 1.开始 首先点击…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

IDEA 配置阿里规范检测

IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中,右键 然后会给出一些不符合规范的修改建议: 保存代码时自动格式化代码 安装插件: 配置插件:

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比 —— 杭州 2024-03-19 夜 code review! 文章目录 CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比1.三者区别2.具体示例说明3.CMAKE_SOURCE_DIR 和 PROJECT_S…

Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案

项目简介 Open-Sora项目是一项高效制作高质量视频的工作&#xff0c;明确所有权使用其模型、工具和内容的计划。通过采用开源原则&#xff0c;Open-Sora 不仅实现了先进的视频生成技术的普及&#xff0c;还提供了一个专业且用户界面的方案&#xff0c;简化了视频制作的复杂性。…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

算法---二分查找练习-2(寻找旋转排序数组中的最小值)

寻找旋转排序数组中的最小值 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;检查数组的最后一个元素是否大于第一个元素。如果是&#xff0c;说明数组没有进行旋转&#xff0c;直接返回第一个元素作为最小值…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

vue项目:使用xlsx导出Excel数据

文章目录 一、安装xlsx二、报错及解决三、编写公共方法四、方法使用 一、安装xlsx 执行命令&#xff1a;npm i xlsx file-saver --save 二、报错及解决 使用时&#xff1a;import XLSX from "xlsx"; 发现如下报错信息 报错原因&#xff1a;xlsx版本不兼容。 解…

Java项目基于SpringBoot和Vue的时装购物系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的时装购物系统。 &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介&#xff1a;混迹在java圈十年有余&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

Django单表数据库操作

单表操作 测试脚本 当你只想测试django某一个py文件的内容,可以不用书写前后端的交互,直接写一个测试脚本即可 单表删除 数据库操作方法: 1.all():查询所有的数据 2.filter():带有过滤条件的查询 3.get():直接拿数据对象,不存在则报错 4.first():拿queryset里面的第一个元素…

天童知识课堂|“春分”

春色正中分&#xff0c;人间恰良辰。春分&#xff0c;也称升分&#xff0c;是二十四节气之一。春分的到来&#xff0c;意味着春天已经过去一半了&#xff0c;气候也逐渐温暖&#xff0c;阳光更加明媚。而关于春分的知识&#xff0c;你知道多少呢&#xff1f;来和天童美语一起了…

鸿蒙开发实战:【系统服务管理部件】

简介 samgr组件是OpenHarmony的核心组件&#xff0c;提供OpenHarmony系统服务启动、注册、查询等功能。 系统架构 图 1 系统服务管理系统架构图 目录 /foundation/systemabilitymgr ├── samgr │ ├── bundle.json # 部件描述及编译文件 │ ├── frameworks …

vue+elementui中table实现单选行功能

el-table插件可以选择行&#xff0c;但是只能多选&#xff0c;而项目中有单选的需求。 效果如下图所示&#xff0c;点击行或者点击复选框都可以选中行&#xff08;高亮&#xff0c;复选框选中&#xff09;&#xff0c;并且每次只选中当前行&#xff0c;之前选中的行清空。点击标…

Elasticsearch:让你的 Elasticsearch 索引与 Python 和 Google Cloud Platform 功能保持同步

作者&#xff1a;来自 Elastic Garson Elasticsearch 内的索引 (index) 是你可以将数据存储在文档中的位置。 在使用索引时&#xff0c;如果你使用的是动态数据集&#xff0c;数据可能会很快变旧。 为了避免此问题&#xff0c;你可以创建一个 Python 脚本来更新索引&#xff0…

端口如何映射到外网?

在现代信息化社会中&#xff0c;远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下&#xff0c;端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…