【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,一经查实,立即删除!

相关文章

商品规格存储问题

准备条件 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version> <!-- 指定您需要的 FastJSON 版本 --></dependency>Testvoid test6() {// 创建 JSON 对象JSONObjec…

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 同城信息网爬取相关城市的房源出租信息&#xff0c;然后通过高德地图把房源信息地图显示&#xff0c;通过地图进行浏览&#xff0c;点击相应的热点文字…

二叉树|二叉树的层序遍历 (广度优先搜索)

力扣题目链接 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {queue<TreeNode*> que;if (root ! NULL) que.push(root);vector<vector<int>> result;while (!que.empty()) {int size que.size();vector<int>…

网络工程师练习题3

网络工程师 在Cisco Catalyst 3548以太网交换机上建立一个名为lib105的VLAN&#xff0c;下列正确的配置是&#xff08;&#xff09;。 A.Switch-3 548#vlan 1 name lib 105 Switch-3548#exitB.Switch-3548&#xff08;valn&#xff09; 1 name lib 105C. Switch-3548&#xf…

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

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

使用 CSS 实现毛玻璃效果

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

愚人节礼物(C++)

这不愚人节 快到了吗&#xff1f;身为顶级程序员&#xff0c;不用c编写愚人节礼物那心里是很不舒服的&#xff0c;所以&#xff0c;趁着愚人节到来之际&#xff0c;下面分享一种坑朋友的c代码&#xff1a; 内容包含一些敏感词&#xff0c;如果对你产生了影响或伤害&#xff0c;…

IDEA 配置阿里规范检测

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

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

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

MyBatis面试简答题

以下是一份MyBatis的高难度简答题,共20题: 请解释MyBatis中#{}和${}的区别,并举例说明它们在实际应用中的使用场景。 MyBatis的Mapper接口是如何与XML映射文件关联的? 如何在MyBatis中实现动态SQL?请列举几种常见的动态SQL元素并解释其作用。 描述MyBatis中的ResultMap的作…

[python] ETL 工作流程 Prefect

Prefect 是一个用于构建、调度和监控数据流程的 Python 库。它提供了一种简单而强大的方式来管理 ETL&#xff08;Extract, Transform, Load&#xff09;工作流程。下面是一个简单的示例&#xff0c;演示了如何使用 Prefect 来创建和运行一个简单的任务&#xff1a; 首先&…

深入理解JavaScript对象类型及其用法

在JavaScript中&#xff0c;对象是一种复合数据类型&#xff0c;用于存储多个值作为属性。这些属性可以是原始数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;也可以是其他对象。JavaScript对象的灵活性和强大功能使其成为编程中的关键概念。本文将深入探讨Java…

Pug 模板引擎:学习与使用

Pug 模板引擎&#xff1a;学习与使用 在前端开发中&#xff0c;模板引擎的使用可以极大地提高代码的可读性和可维护性。Pug&#xff08;也称为 Jade&#xff09;是一个流行的 Node.js 模板引擎&#xff0c;它使用简洁的语法来创建 HTML 结构。由于在vue3文档中看到了Pug的影子…

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版本不兼容。 解…