C++的编译流程

2023-05-16

C/C++的编译流程

编译流程分为四个阶段:预处理、编译、汇编、链接

Linux系统下g++编译为例:

通过g++的选项可以查看过程中的每一步

在这里插入图片描述

预处理: 处理一些#号定义的命令或语句(如#define、#include、#ifdef等),生成.i文件

编译:进行词法分析、语法分析和语义分析等,生成.s的汇编文件

汇编:将对应的汇编指令翻译成机器指令,生成二进制.o目标文件

链接:链接分为两种

  • 静态链接

​ 在链接期,将静态链接库中的内容直接装填到可执行程序中。

​ 在程序执行时,这些代码都会被装入该进程的虚拟地址空间中。

  • 动态链接

​ 在链接期,只在可执行程序中记录与动态链接库中共享对象的映射信息。

​ 在程序执行时,动态链接库的全部内容被映射到该进程的虚拟地址空间。其本质就是将链接的过程推迟到运行时处理


扩展:

1、 为什么要有静态链接?

​ 在我们的实际开发中,不可能将所有代码放在一个源文件中,所以会出现多个源文件,而且多个源文件之间不是独立的,而会存在多种依赖关系,如一个源文件可能要调用另一个源文件中定义的函数,但是每个源文件都是独立编译的,即每个.c文件会形成一个.o文件,为了满足前面说的依赖关系,则需要将这些源文件产生的目标文件进行链接,从而形成一个可以执行的程序。这个链接的过程就是静态链接

由很多目标文件进行链接形成的是静态库,反之静态库也可以简单地看成是一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件

2、 静态链接的优缺点:

缺点:

  • 浪费空间,因为每个可执行程序中对所有需要的目标文件都要有一份副本,如果运行多个程序并且这些程序都对同一个目标文件有依赖,那么目标文件在内存中就会存在多个副本;

  • 更新困难,因为每当一个依赖文件的代码修改了,这个时候就需要全部重新编译链接形成新的可执行程序。

优点:

  • 运行速度快并且不依赖外部环境,因为在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。

在这里插入图片描述

注意: 我们知道,链接器在链接静态链接库的时候是以目标文件为单位的。比如我们引用了静态库中的printf()函数,那么链接器就会把库中包含printf()函数的那个目标文件链接进来,如果很多函数都放在一个目标文件中,很可能很多没用的函数都被一起链接进了输出结果中。由于运行库有成百上千个函数,数量非常庞大,每个函数独立地放在一个目标文件中可以尽量减少空间的浪费,那些没有被用到的目标文件就不要链接到最终的输出文件中。

3、 为什么要有动态链接?

​ 为了解决静态链接中提到的两个问题,一方面是空间浪费,另外一方面是更新困难。

​ 流程简介:

​ 假设现在有两个程序program1.o和program2.o,这两者共用同一个库lib.o,假设首先运行程序program1,系统首先加载program1.o,当系统发现program1.o中用到了lib.o,即program1.o依赖于lib.o,那么系统接着加载lib.o,如果program1.o和lib.o还依赖于其他目标文件,则依次全部加载到内存中。当program2运行时,同样的加载program2.o,然后发现program2.o依赖于lib.o,但是此时lib.o已经存在于内存中,这个时候就不再进行重新加载,而是将内存中已经存在的lib.o映射到program2的虚拟地址空间中,从而进行链接.

4、 动态链接的优缺点:
优点:

  • 节约内存: 即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分,副本,而是这多个程序在执行时共享同一份副本;

  • 更新方便: 更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。

缺点:

  • 性能略差: 因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。
  • 依赖外部环境: 因为把链接推迟到了程序运行时,所以要保证程序运行时外部的库存在且内容正确无误。

在这里插入图片描述

参考:https://www.cnblogs.com/cyyljw/p/10949660.html

2022/09/24

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的编译流程 的相关文章

  • VIO学习总结

    VIO xff08 visual inertial odometry xff09 即视觉惯性里程计 xff0c 有时也叫视觉惯性系统 xff08 VINS xff0c visual inertial system xff09 xff0c 是
  • 单应性(Homography)变换

    我们已经得到了像素坐标系和世界坐标系下的坐标映射关系 xff1a 其中 xff0c u v表示像素坐标系中的坐标 xff0c s表示尺度因子 xff0c fx fy u0 v0 xff08 由于制造误差产生的两个坐标轴偏斜参数 xff0c
  • senmantic slam mapping

    basicStructure hpp common h 定义一些常用的结构体 以及各种可能用到的头文件 xff0c 放在一起方便include 相机内参模型 增加了畸变参数 xff0c common headers h各种可能用到的头文件
  • Ubuntu 20.04 VNC 安装与设置

    原链接 VNC是一个远程桌面协议 按照本文的说明进行操作可以实现用VNC对Ubuntu 20 04进行远程控制 一般的VNC安装方式在主机没有插显示器的时候是无法使用的 下面的操作可以在主机有显示器和没有显示器时都能够正常工作 首先安装x1
  • opencv中类型转换问题

    记录一下最近困惑我的问题 方便以后查阅 在学习立体匹配算法中BM算法时 xff0c 出现在了关于类型转换的问题 xff1a disp convertTo disp8u CV 8U 255 numberOfDisparities 16 不知道
  • 最大似然估计MLE与贝叶斯估计

    最大似然估计 Maximum Likehood Estimation MLE 最大似然估计的核心思想是 xff1a 找到参数 的一个估计值 xff0c 使得当前样本出现的可能性最大 用当年博主老板的一句话来说就是 xff1a 谁大像谁 xf
  • 大疆Livox_mid 40雷达初体验

    为了解决无人车上镭神雷达FOV小而导致的车前3m内无法看到锥形桶问题 东家给公司邮寄了一台大疆的mid40雷达 不得不说 颜值真的高 光看颜值 就甩镭神几条街 昨天重新配置镭神的激光雷达 官方给的配置软件 真的是 用的我心碎啊 算了 不提了
  • 地铁供电系统的构成

    地铁供电系统一般划分为以下几部分 xff1a 外部电源 xff1b 主变电所 xff1b 牵引供电系统 xff1b 动力照明系统和杂散电流腐蚀防护系统 xff1b 电力监控系统 外部电源地铁供电系统的外部电源就是地铁供电系统主变电所供电的外
  • C++ Vector常用函数

    C 43 43 Vector常用函数 begin 函数 原型 xff1a iterator begin const iterator begin 功能 xff1a 返回一个当前vector容器中起始元素的迭代器 end 函数 原型 xff1
  • STM32使用ADC获取内部温度传感器数据输出(直接读取/DMA两种方式实现)

    STM32使用ADC获取内部温度传感器数据输出 xff08 直接读取 DMA两种方式实现 xff09 前言一 内部温度传感器的使用 xff1f 二 代码操作讲解1 直接读取2 DMA处理 总结 前言 STM32F1系列 xff08 本代码基
  • fp32/fp64精度,4/8字节16进制转float/double十进制

    1 IEEE 754 32位单精度浮点数 xff08 4字节 xff09 1 1 32位单精度浮点数 其中 xff0c 32位16进制数包括1位符号位 SIGN xff0c 8位指数位 EXPONENT 和 23位尾数位 MANTISSA
  • SVG绘制圆环进度条

    在我们的大屏可视化项目中 xff0c 经常会用到各种各样的图表 与传统的表格展示 枯燥的文字阐述相比 xff0c 图表展示则使用户看起来更加直观 数据的展示则更加一目了然 本文基于svg绘图技术结合前端技术栈vue xff0c 以工作中常用
  • Canvas绘制地图

    在我们的大屏可视化项目中 xff0c 地图数据可视化是最常见功能 地图数据可视化目前的实现方案有很多 xff0c 其中最具有代表性的莫过于使用echarts xff0c 引入一个js文件 xff0c 再加上一些简单的配置 xff0c 这样一
  • 滚动动画(跑马灯动画)的几种实现方式

    在大屏可视化应用中 xff0c 滚动动效 xff08 跑马灯效果 xff09 也是常见的一种数据展现方式 xff0c 本章节针对字幕滚动和列表滚动效果做一个小小的总结 xff0c 结合vue框架 xff0c 具体展示效果如下 xff0c 从
  • 如何在Ubuntu上安装CUDA

    原链接 在Ubuntu上安装CUDA一直是比较麻烦的事情 由于不同版本的CUDA对显卡驱动有着不同的需求 而在有些电脑上安装最新的Nvidia闭源显卡驱动会导致无法进入图形界面 CUDA中也自带了Nvidia的显卡驱动 xff0c 但是如果
  • 加载loading动画

    提起加载 xff08 loading xff09 效果 xff0c 想必大家都不会陌生 xff0c 在目前的移动端 PC端 各类app均广泛使用 xff0c 使用loading动画能显著提升用户的交互体检 xff0c 尤其是在页面加载速度比
  • CSS锥形渐变实现环形进度条

    10月份因为疫情原因 又开启了居家办公模式 xff0c 空闲之余 xff0c 与其选择 躺平 xff0c 不如去做一些有意义的事情 xff0c 内心的想法驱使着我去做些什么 xff0c 但是又没有合适的素材 xff0c 直到接手了最近的一个
  • CSS实现个性化水球图

    在可视化应用中 xff0c 水球图也是一种常见的数据展示形式 xff0c 关于使用CSS实现个性化水球 xff0c 在相当长的一段时间并没有找到比较简洁的实现方式 xff0c 因此在以往的可视化作品中 xff0c 大多采用echarts插件
  • CSS实现3D球面字符云

    在大屏可视化应用中 xff0c 使用3D的场景有很多 xff0c 复杂的交互动画通常是使用Three js或echarts gl来实现 xff0c 但是在一些简单的3D场景中 xff0c CSS也可以实现一些不错的展示效果 本文使用CSS相
  • CSS实现渐变仪表盘的简单尝试

    在 CSS锥形渐变实现环形进度条 一章中 xff0c 讲解了实现渐变进度条的一点思路 xff0c 基于此思路 xff0c 本章节尝试性的使用CSS实现一个简单的渐变仪表盘 xff0c 给大家提供一些借鉴 实现角向渐变 xff0c 不得不提一

随机推荐

  • 【opencv】OpenCV开发环境配置(C++)

    软件版本 opencv 4 7 0 windowsvisual studio 2022 环境配置 1 创建项目 打开VS 2022 xff0c 点击创建新项目 点击项目 gt 点击属性 2 添加包含目录 点击VC 43 43 目录 gt 点
  • 1、什么是网络前缀

    基础知识 xff1a 1 已知一个IP地址 xff0c 如何区分它是A类地址还是B类或者C类地址呢 A类地址 1 0 0 0 到126 0 0 0 0 0 0 0 和127 0 0 0保留 B 类地址 128 1 0 0到191 254 0
  • ZYNQ petalinux设置固定IP地址

    背景 xff1a zynq petalinux在开机自启动以后ifconfig设置ip xff0c 然后运行应用程序 xff1b 如果设备没有串口且程序在启动过程中用Wireshark抓取不到信息 xff0c 这时 xff0c 就要使用固定
  • 10、IEEE802.3和Ethernet II帧的区别, 0x0806 ARP协议分析

    一 IEEE802 3和Ethernet II帧的区别 概念 xff1a 1 以太网上使用两种标准帧格式 第一种是上世纪80年代提出的DIX v2格式 xff0c 即Ethernet II格式 第二种是1983年提出的IEEE 802 3格
  • W10: Warning: Changing a readonly file使用vi/vim报错问题解决(使用管理员也不能修改)

    使用vi vim编辑文件的时候出现W10 Warning Changing a readonly file报错 解决方法 xff1a 一 强制保存退出 xff1a wq 二 ll 查询文件属主 xff0c 使用属主赋予权限 chmod u
  • 使用Galileo SDK跨局域网遥控机器人

    原链接 GalileoSDK是由我们开发的机器人导航系统SDK 通过SDK用户能够方便的操控机器人 现在小强用户已经可以免费体验到SDK的功能了 SDK内部集成了物联网连接功能 设置完成后用户能够通过SDK跨局域网遥控和获取机器人状态 下面
  • zcu102网口不通

    新建工程采用的板子默认配置 xff0c 启动后执行命令 xff1b dmesg grep ethernet 1 545671 macb ff0e0000 ethernet Not enabling partial store and for
  • zcu102开发板实现 虚拟jtag

    开发板zcu102 xff1b petalinux2020 1 需要自备一个FMC转JTAG的子卡 xff1b 此篇记录自己实现的过程 xff0c 以备查询 xff1b 1 整个流程连接 xff1a https xilinx wiki at
  • 查看ubuntu系统的版本信息、内存大小及使用、磁盘大小等常用命令

    一 ubuntu系统的版本信息 xff1a 方法 步骤 xff1a 1 进入Ubuntu系统 xff0c 点击左侧图标栏中的黑框 xff0c 打开终端 xff1b 2 左侧没有终端图标的情况 xff0c 可以搜索按钮 图中左侧第一个 xff
  • CentOS7 无法进入图形界面 黑屏

    问题现象描述 xff1a CentOS有界面的系统 xff0c 开机后进入界面 xff0c 在开机界面背景为 7 的地方卡住 xff0c 然后界面就黑掉 解决办法 xff1a 1 开机后 xff0c 按下 ctrl 43 alt 43 F2
  • 重装win10提示“Windows无法安装到这个磁盘,选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装...”

    背景 xff1a 因为GHOST系统会捆绑大量软件 xff0c 主页被强制修改 xff0c 并且系统还可能存在删减的可能性 xff0c 所以越来越多的用户考虑安装官方MSDN原版系统 xff0c 但是呢 xff0c 近期总是有用户称自己在安
  • 在petalinux下提示:Failed to menu config project component....

    现象 xff1a 在petalinux下配置硬件描述语言时 xff0c 提示错误 xff1a 命令 xff1a petalinux config get hw description 61 hdf path 错误提示 xff1a ERROR
  • petalinux下修改系统空间笔记

    该文档是自己记录的笔记 xff0c 方便后面自己查看 在petalinux设置系统空间中需要注意的点 xff01 1 在menuconfig界面下设置系统空间为了在内核启动输出显示 xff1b Subsystem AUTO Hardware
  • PetaLinux 去除用户登陆 (Login into target without pass word)

    PetaLinux 自动登录登陆 1 初始化 PetaLinux 运行环境 xff1a source PetaLinux安装目录 settings sh 2 更改 PetaLinux 配置 xff1a 1 cd 到项目工程目录下 xff1b
  • PetaLinux 使用外部代码 (u-boot)

    背景 xff1a 在petalinux编译工程时 xff0c 我们可能有修改u boot源码的需求 xff0c 这时就需要我们使用外部的代码进行编译 实现步骤 xff1a 在配置前 xff0c 请确认我们已经在github上把对应的uboo
  • 异常的抛出和处理

    自定义输出异常 package error import java util ArrayList public class Exception public static void main String args TODO Auto ge
  • 在ROS中使用UDP进行通信

    原链接 ROS的网络通信提供了两种方式 xff0c 一种是TCP协议 xff0c 一种是UDP协议 默认采用TCP进行通信 但是在实际的WIFI网络使用中发现用户经常反馈客户端和机器人连接中断且无法重新建立连接 在ROS wiki中官方也有
  • 网络编程TCP/IP和UDP以及HTTP协议

    OSI的七层模型和TCP IP的四层模型 TCP IP协议是从OSI的七层模型中简化出来的 四层模型的详图 什么是HTTP协议 HTTP称为 超文本传输协议 是一种基于应用层的通信协议 xff0c 它允许将超文本标记语言 HTML 文档从W
  • 网络字节序之大小端(字节序与比特序)

    引言 xff1a 最近在网上看了很多博客 xff0c 想要深入了解大小端问题 xff0c 主要是做毕设时 xff0c RTP包协议的结构体定义有两种方式 xff0c 即大端和小端 但是一些博客并没有讲到理解大小端的本质问题 xff0c 在这
  • C++的编译流程

    C C 43 43 的编译流程 编译流程分为四个阶段 xff1a 预处理 编译 汇编 链接 以Linux系统下g 43 43 编译为例 xff1a 通过g 43 43 的选项可以查看过程中的每一步 预处理 xff1a 处理一些 号定义的命令