Cpp学习——编译链接

2023-10-27

目录

​编辑

一,两种环境

二,编译环境下四个部分的

1.预处理

2.编译

3.汇编

4.链接

 三,执行环境

 


 

一,两种环境

在程序运行时会有两种环境。第一种便是编译环境,第二种则是执行环境。如下图:

在程序运行时,首先会让源文件文件经过编译环境。在编译环境中,源文件会经过以下四个个过程:预处理,编译,汇编,链接。也就是说,编译环境还会细分为四个组成部分:

 

在经过编译环境的这四个部分以后便会生成。exe文件来执行相应代码要执行的任务。

二,编译环境下四个部分的

1.预处理

代码在编译环境下第一个要经历的便是预处理,也叫预编译。在这个部分,代码要被做以下处理:

 1.头文件展开。

2.宏替换。

3.消除注释。

4.条件编译。(这个我不太懂)

在经过上面四步以后会生成一个.i文件,这个文件里的内容就是源文件在经过上面四步以后的内容。所以.i文件里的内容的行数会比源文件的行数要少。

2.编译

在这一步,要经历的过程便是以下几步:

1.语法分析。

2.词法分析。

3.语义分析。

4.符号汇总。

5.生成汇编代码。(指令级代码)。

6.生成.s文件。

我们平时写代码时如果发生语法错误便是在这一步检测出来的。并且在编译的过程中会对函数名进行重命名。在C语言中,在VS环境下对函数名进行重命名的规则便是在函数名前加一个"_"。但是在C++中,函数重命名则会根据参数的类型来重命名。所以,因为C++的这一项进步于是会C++便便支持了函数重载。

3.汇编

汇编的过程便是将指令代码翻译成机器码,也就是二进制码的后生成目标文件的过程。在这个过程中还要将程序里面的各个函数的函数名和地址给汇总起来生成符号表。在这个过程中要做的便是以下几步:

1.将汇编代码翻译成二进制的机器码。

2.生成目标文件。

3.生成符号表。

4.链接

链接的意思便是将程序中的多个文件链接起来共同完成一项任务。在这个过程中因为有多个目标文件,也就意味着有多个符号表。并且我们的代码是通过符号表里面的函数名和地址来跳转调用函数的。所以在链接时就必需要做到下面的几步:

1.合并段表。

2.合并符号表。

合并段表的目的是将多个目标文件给连接起来。合并符号表的目的是将各个目标文件里的符号表搞在一起方便查找。在这里要注意两种种链接错误的情况:

1.函数的声明和定义放在同一个文件中。

这样会导致链接错误的原因是有两个同名但是地址不同的函数在符号表中。在调用时便会出现歧义,导致错误。

2.只有声明,没有定义。

这样的错误是因为符号表里的声明的函数没有一个有效的地址。在调用时不知道该跳转到什么地方调用函数所以导致错误。

 三,执行环境

在这个环境中便是生成.exe文件实现运行逻辑。

 

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

Cpp学习——编译链接 的相关文章

  • 选择一家公司看哪些条件

    1 薪资 公司谈的工资都是税前 一般我会认为年薪工资指的就是一年的税前收入 如果有加班费可以把加班费也算上 每月加班时间是有上限的 可以根据个人习惯计算 然后是年终奖 则税前年薪 税前基本工资 加班费 年终奖 你看工资银行卡一年的薪资到账记
  • xcode报错:Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/b

    今天使用xcode编译工程发现一个问题 这里记录一下防止忘记 xcode报错 Command Applications Xcode app Contents Developer Toolchains XcodeDefault xctoolc
  • 本地部署Stable Diffusion

    效果 遇到的坑 报错 RuntimeError LayerNormKernelImpl not implemented for Half 解决方案 产生报错的原因是因为显卡不支持half float的数据类型 所以在启动项set COMMA

随机推荐

  • 微信小程序(由浅到深)

    文章目录 一 项目基本配置 1 项目组成 2 常见的配置文件解析 3 app json全局的五大配置 4 单个页面中的page配置 5 App函数 6 tabBar配置 二 基本语法 事件 单位 1 语法 2 事件 3 单位 三 数据响应式
  • python语法-pyspark实战(数据输入)

    python语法 pyspark实战 数据输入 1 演示通过pyspark代码加载python对象数据 基本数据结构 转为RDD对象 即数据输入 parallelize 方法 演示通过pyspark代码加载数据 即数据输入 from pys
  • varchar2 汉字长度问题

    转载于 https www cnblogs com yangxia test archive 2013 08 07 3242775 html Oracle定义varchar2 类型存储汉字的长度问题 varchar2最大是4000字节 那么
  • 使用 Iptables 命令详细图文教程

    目录 一 防火墙管理工具 二 Iptables 2 1 策略与规则链 2 2 基本的命令参数 2 2 1 在 iptables 命令后添加 L 参数查看已有的防火墙规则链 2 2 2 在 iptables 命令后添加 F 参数清空已有的防火
  • 【Altium designer】定义PCB外形并开槽

    1 PCB自定义外形 项目中经常会用到异形的PCB 需要先在keep out画出PCB外形 也可以直接从cad里面导到AD里面 要注意单位长度的转换 然后框选中keep out的线条 按下快捷键D S D 设计 gt 板子形状 gt 按照选
  • python-爬虫 抓取美食板块商家数据

    import pprint import requests import csv import re url http meishi meituan com i api channel deal list headers User Agen
  • 【odoo15】给用户设置菜单可见的权限与权限组

    设置mykid菜单的可见权限 设置权限后 操作方法 设置 gt 用户和公司 gt 组群 gt 创建组群 test group 技术 gt 用户界面 菜单项目 gt 搜索要添加到组群的菜单 mykid 把用户添加到组群中 刷新后admin这个
  • PageHelper分页插件使用

    分页插件PageHelper MyBatis没有分页功能 需要手动编写LIMIT语句 可以使用第三方的插件来对功能进行扩展 分页助手PageHelper是将分页的复杂操作进行封装 使用简单的方式即可获得分页的相关数据 PageInfo Pa
  • 将代码托管到Github

    1 进入Github网站 https github com 选择登录 sign in 或注册 sign up 如图所示 2 下载桌面程序 GitHub Desktop 网址 https desktop github com 按提示默认安装即
  • pytorch,numpy两种方法实现nms类间+类内

    类间 也就是不同类之间也进行nms 类内 就是只把同类的bboxes进行nms numpy实现 nms类间 类内 import numpy as np 类间nms def nms bboxes scores thresh x1 y1 x2
  • python os.walk 指定遍历深度_安全检查中...

  • Spring:基于xml和注解的aop

    1 导入坐标
  • K8s相关常用命令

    一 查看相关信息 查看pod相关信息 kubectl get pod all namespaces grep 关键字 kubectl get po all namespaces owide grep 关键字 kubectl describe
  • Docker容器与虚拟化技术:Dockerfile部署LNMP

    目录 一 理论 1 LNMP架构 2 背景 3 Dockerfile部署LNMP 3 构建Nginx镜像 4 构建MySQL容器 5 构建PHP镜像 6 启动 wordpress 服务 二 实验 1 环境准备 2 构建Nginx镜像 3 构
  • Websocked的原理和应用场景(心跳模式)

    一 WebSocket是什么 工作原理是什么 WebSocket是一种在Web应用程序中实现双向通信的网络协议 它提供了一种持久连接 允许服务器主动向客户端发送消息 同时也允许客户端向服务器发送消息 相比传统的HTTP请求 响应模式 Web
  • 动态规划之背包问题

    前言 动态规划的本质 是对问题状态的定义和状态转移方程 动态规划具备三个特点 1 将原来的问题分解成几个相似的子问题 2 所有的子问题都只需要解决一次 3 每个状态存储子问题的解 一般从三个角度考虑动态规划 1 状态表示 2 状态计算 gt
  • C++笔试机考三道代码题——包括输入输出

    一 在相邻差为 1 的整数数组中进行有效搜索 时间限制 1000MS 内存限制 65536KB 题目描述 给定一个由n 个整数组成的数组 每个数组元素是通过将 1 或 1 添加到前一个元素获得的 即任意两个连续元素之间的绝对差为 1 任务是
  • 如何在没有iTunes的情况下备份和还原iPhone或iPad

    Justin Duino 贾斯汀 杜伊诺 Justin Duino iTunes can be a chore but here s some happy news In macOS Catalina you no longer need
  • Javascript和CSS的标签属性对应表

    在写javascript中 经常要用到style对象的css属性 很多不记得 其实很好记 基本就是CSS中的 转化为javascript的驼峰写法 除了注意下float 盒子标签和属性对照 CSS语法 不区分大小写 JavaScript语法
  • Cpp学习——编译链接

    目录 编辑 一 两种环境 二 编译环境下四个部分的 1 预处理 2 编译 3 汇编 4 链接 三 执行环境 一 两种环境 在程序运行时会有两种环境 第一种便是编译环境 第二种则是执行环境 如下图 在程序运行时 首先会让源文件文件经过编译环境