C/C++ :程序环境和预处理(上)

news2024/11/28 14:42:48

目录

程序的编译链接过程

1.编译过程中的预处理阶段

2.编译过程中的正式编译阶段 

3.编译过程中的汇编阶段

4.链接过程


程序的编译链接过程

一个程序的源码文件要经过复杂的编译链接过程才能被转换为可执行的机器指令(二进制指令)

编译链接过程概述:

  1. 编译过程:组成一个程序的每个源码文件通过编译过程分别被转换成目标文件(linux下为.o文件)
    (注意每个源文件的编译过程都是分别独立进行的)
  2. 链接过程:每个目标文件(.o文件)由链接器(linker)链接在一起,形成一个单一而完整的可执行程序(.exe文件)

编译链接过程图:

1.编译过程中的预处理阶段

源码中的 # 修饰的语句代表预处理指令;

编译过程的预处理阶段(预处理阶段进行的是一些文本操作)主要完成的事情:

  • #include所指向的头文件中所有内容会被"复制粘贴"到#include语句所在的源文件
  • #define定义的符号的替换
  • 注释的删除

注意:该阶段不进行语法检查

一个源码文件预处理完成后会生成一个对应的 .i 源码文件

在win10的gcc编译环境下用vscode对源码文件进行预处理,在终端中输入:

gcc -E ./文件名 -o 输出的文件名(任意取)

编译器执行指令后便得到被预处理的源文件对应形成的.i文件

 

2.编译过程中的正式编译阶段 

编译过程的正式编译阶段主要完成的事情:

  • 对文件中的源码进行语法检查以及各种分析(语法有误则报出编译错误)
  • 将 .i 文件中的源代码翻译成汇编代码,生成.s文件
  • 进行符号汇总

符号汇总会将.i文件中所有函数,全局变量经过修饰的名称全部汇总起来,为符号表的生成做准备。(符号表在链接过程中起到重要作用)

在win10的gcc编译环境下用vscode对.i文件进行正式编译,在终端中输入:

gcc -S ./test.i

生成.s文件(汇编代码)

3.编译过程中的汇编阶段

编译过程的汇编阶段主要完成的事情:

  • 存储汇编指令的.s文件汇编成 .o文件(二进制文件)
  • 形成符号表

符号表中存储了.s文件中所有函数的经修饰的名称(以及对应函数体的地址)全局变量的名称(以及定义它们的指令的地址)

  • 注意如果当前源文件没有定义某个被调用的函数(或全局变量),那么在符号表中该函数(或全局变量)所对应的地址将为无效地址(等到链接阶段再完成寻址)

比如:

4.链接过程

链接过程主要完成的事情:

  • 各.o文件的合并
  • 各.o文件的符号表的合并

 比如:

  • 链接过程完成后如果符号表中的无效地址仍然无法得到确定,编译器就会报出链接错误
  • C++中修改了C语言符号表中对函数名的修饰规则,为函数重载提供了底层机制上的支持.参见:函数重载http://t.csdn.cn/tYd4h

编译链接流程总览:

 

 

 

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

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

相关文章

java顺序存储二叉树应用实例

八大排序算法中的堆排序,就会使用到顺序存储二叉树。 1.线索化二叉树 1.1先看一个问题 将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n17 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8, 10, 14 这几个…

windows装双系统,添加ubuntu

1、查看分区 此电脑右键---管理----磁盘管理----选有空闲位置的硬盘右键----压缩卷 就会出现空闲的卷 2 制作U盘,U盘初始是空的 下载rufus win10系统怎么查看磁盘分区形式 【百科全说】 (bkqs.com.cn) 双击打开----如下配置 出现这个提示,照做 …

内存数据库Apache Derby、H2

概述 传统关系型数据库涉及大量的工作,如果想在Java应用程序里使用MySQL数据库,至少需要如下步骤: 安装(可选:配置用户名密码)建表(要么从命令行进入,要么安装一个可视化工具&…

Java基础-网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…

Springboot扩展点之InstantiationAwareBeanPostProcessor

前言前面介绍了Springboot的扩展点之BeanPostProcessor,再来介绍另一个扩展点InstantiationAwareBeanPostProcessor就容易多了。因为InstantiationAwareBeanPostProcessor也属于Bean级的后置处理器,还继于BeanPostProcessor,因此Instantiatio…

vue-cli3创建Vue项目

文章目录前言一、使用vue-cli3创建项目1.检查当前vue的版本2.下载并安装Vue-cli33.使用命令行创建项目二、关于配置前言 本文讲解了如何使用vue-cli3创建属于自己的Vue项目,如果本文对你有所帮助请三连支持博主,你的支持是我更新的动力。 下面案例可供…

【C++】类与对象(上)

文章目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装①访问限定符②封装五、类的作用域六、类的实例化七、类对象模型①如何计算类对象大小②类对象的存储方式③结构体中内存对齐规则八、this指针①this指针的引出②this指针的特性一、面…

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

本文框架 1.概述2. A2L文件编辑及生成2.1 新建项目工程2.2 加载elf文件2.3 A2L文件的项目属性配置2.4 DAQ事件的设定2.5 添加观察量2.6 添加标定量2.7 编译生成A2l1.概述 在前面一篇文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍01-测量与标定底层…

JavaScript 类继承

JavaScript 类继承 JavaScript 类继承使用 extends 关键字。 继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。 super() 方法用于调用父类的构造函数。 当创建一个类时,您不需要重新编写新的数据成员和成员函数&…

synchronized和ReentrantLock之间的区别

synchronized和ReentrantLock的区别 synchronized是一个关键字,是JVM内部实现的;ReentrantLock是标准库的一个类,是JVM外部基于Java实现的。synchronized在申请锁失败时会死等;ReentrantLock可以通过tryLock的方式等待一段时间就…

偏微分方程约束下的优化控制问题(PDE-constrained optimal control problems)

优化控制问题介绍 优化控制问题的数学形式 {min⁡(y(x),u(x))∈YUJ(y(x),u(x)),s.t. F(y(x),u(x))0in Ω,and u(x)∈Uad,\left\{\begin{aligned} &\min _{(y(\mathbf{x}), u(\mathbf{x})) \in Y \times U} J(y(\mathbf{x}), u(\mathbf{x}) ),\\ &\text { s.t. } \ \…

Python列表的元素比较

在用python处理多个列表元素时,需要处理的信息一般比较多且杂。这时运用Python列表元素比较的方法,就能快速处理列表信息,能更轻松访问每个元素。1 问题如何运用Python列表的元素比较解决问题。2 方法方法一 for循环,此情况是list…

Spring 事务【隔离级别与传播机制】

Spring 事务【隔离级别与传播机制】🍎一.事务隔离级别🍒1.1 事务特性回顾🍒1.2 事务的隔离级别(5种)🍒1.3 事务隔离级别的设置🍎二.Spring 事务传播机制🍒2.1 Spring 事务传播机制的作用🍒2.2 事…

描述性统计图表——箱线图

文章目录1、分位数1.1、分位数的概念1.2、特殊分位数1.3、分位数的计算2、箱线图2.1、概念2.2、作图步骤2.3、箱线图的作用2.3.1、定位异常值2.3.2、偏态和尾重2.3.3、数据的形状1、分位数 1.1、分位数的概念 分位数(Quantile),亦称分位点&a…

红黑树简析

一. 概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是…

java 自定义json解析注解 复杂json解析

java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…

【c++之于c的优化 - 下】

前言 一、inline 概念 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译…

契约锁与200多家软件厂商实现集成应用,实现更多业务电子签需求

在中大型组织的数字化建设中,电子签章需求紧紧围绕业务展开,实现电子签章与管理软件集成应用已经成为普遍需求。 契约锁数字可信产品拥有200多家管理软件厂商集成对接经验,覆盖ERP、OA、专项业务系统、移动APP应用、低代码平台、BPM流程、小程…

Vue - 使用Lodash实现防抖和节流

GitHub Demo 地址 在线预览 Lodash 官网 参考: Vue 防抖节流 详细介绍 vue 优雅的实现防抖和节流 防抖、节流的介绍 js防抖和节流的实现原理及应用场景 js防抖节流应用场景及写法 JS中的防抖 什么的防抖和节流? 函数节流(throttle&#x…

论文翻译:2022_Phase-Aware Deep Speech Enhancement: It’s All About The Frame Length

摘要 虽然相位感知语音处理近年来受到越来越多的关注,但大多数帧长约为32 ms的窄带STFT方法显示出相位对整体性能的影响相当有限。与此同时,现代基于深度神经网络(DNN)的方法,如Conv-TasNet,隐式修改幅度和相位,在非常…