Cpp学习——编译链接
目录
编辑
一,两种环境
二,编译环境下四个部分的
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文件实现运行逻辑。
相关文章:
Cpp学习——编译链接
目录 编辑 一,两种环境 二,编译环境下四个部分的 1.预处理 2.编译 3.汇编 4.链接 三,执行环境 一,两种环境 在程序运行时会有两种环境。第一种便是编译环境,第二种则是执行环境。如下图: 在程序运…...
android - fragment 数据丢失?状态丢失?
最佳答案 一些状态丢失的例子: 1. 假设您有一个按钮和一个 TextView 。在代码中,你已经定义了初始值为 0 的整数 i,它通过单击按钮递增 1,并且它的值显示在 TextView 中。假设你已经按下按钮 5 次,那么 textview 将被设置为 0。也…...
Git基本操作
本地仓库 当我们初始化(git init)之后,会在当前目录下生成一个与项目并列的.git文件夹,当我们对项目作出更改之后使用git commit命令,一般是将修改提交到本地仓库,也就是该文件夹下面的文件会对应修改&…...
Nginx配置文件详解
Nginx配置文件详解 1、Nginx配置文件1.1主配置文件详解1.2子配置文件 2、全局配置部分2.1修改启动的工作进程数(worker process) 优化2.2cpu与worker process绑定2.3 PID 路径修改2.4 修改工作进程的优先级2.5调试工作进程打开的文件的个数2.6关闭master-worker工作…...
【0217】stats collector(统计信息收集器)进程启动原理(1)
文章目录 1. 启动 stats collector进程1.1 stats collector进程启动过程1.1.1 检查套接字 pgStatSock 是否存在1.1.2 重新启动失败的stats collector频率1.1.3 fork() 三种返回值处理1.2 detach所有共享内存段1.3 detach 共享内存段1.4 stats collecotr进程启动的主体相关阅读:…...
【应用层】网络基础 -- HTTPS协议
HTTPS 协议原理加密为什么要加密常见的加密方式对称加密非对称加密 数据摘要&&数据指纹 HTTPS 的工作过程探究方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密中间人攻击-针对上面的场景 CA认证理解数据签名方案5-非对…...
实验篇—— 基因家族Motif 分析
实验篇—— 基因家族Motif 分析 文章目录 前言一、名词解释二、实操1. MEME工具箱2. Motif Discovery(基序发现)1. 结果网页2. 在TBtools中(额外) 2. Motif Enrichment(基序富集分析)3. Motif Search&#…...
Linux拓展之阻止或禁用普通用户登录
禁止指定用户登录 chsh -s /sbin/nologin 指定用户名示例 chsh -s /sbin/nologin testuser恢复指定用户登录 chsh -s /bin/bash 指定用户名示例 chsh -s /bin/bash testuser参考 https://blog.csdn.net/cnds123321/article/details/125232580 https://www.cnblogs.com/cai…...
Linux系统USB摄像头测试程序(四)_视频旋转及缩放
下面的程序实现了视频的旋转及缩放,窗口中点击鼠标左键视频向左旋转,点击鼠标右键视频向右旋转并且视频缩小了二分之一。程序中首先把yvyv422转换成了RGB24,然后利用opencv进行了旋转和缩放,其后用sdl2进行了渲染。使用了ffmpeg、…...
大模型+学习机,是概念游戏还是双向奔赴?
众所周知,2023年上半年大模型概念炙手可热。各大科技公司纷纷卷入,或宣称布局相关领域,或率先官宣自研大模型。而随着资本市场对大模型概念的热情有所消退,属于这片战场的新一轮角逐慢慢聚焦在了技术的落地应用上。 8月15日&#…...
linux怎么查看用户属于哪个组
查看当前用户所属组 shell> groups root查看指定用户所属组 shell> groups testuser testuser : testusershell> id testuser uid1000(testuser) gid1000(testuser) groups1000(testuser)查看组文件 shell> cat /etc/group...
邂逅JavaScript
前言:前端三大核心 前端开发最主要需要掌握的是三个知识点:HTML、CSS、JavaScript 一、认识编程语言 1.计算机语言 前面我们已经学习了HTML和CSS很多相关的知识: 在之前我们提到过, HTML是一种标记语言, CSS也是一种样式语言; 他们本身都是属于计算…...
Android 中 Fragment判空
1. 判断 Fragment 是否已经被添加到 Activity 中,可以通过 Fragment 的 isAdded() 方法来判断。 2. 判断 Fragment 的 View 是否已经被创建,可以通过 Fragment 的 getView() 方法来判断。 3. 判断 Fragment 是否已经被销毁,可以通过 Fragme…...
软考高级系统架构设计师系列论文八十八:财务数据仓库系统的设计与实现
软考高级系统架构设计师系列论文八十八:财务数据仓库系统的设计与实现 一、摘要二、正文三、总结一、摘要 近年来,数据仓库技术在信息系统的建设中得到了广泛应用,有效地为决策提供了支持。2020年6月,本人所在单位组织开发了财务管理决策系统,该系统主要是使高层领导掌握企…...
fastdeploy部署多线程/进程paddle ocr(python flask框架 )
部署参考:https://github.com/PaddlePaddle/FastDeploy/blob/develop/tutorials/multi_thread/python/pipeline/README_CN.md 安装 cpu: pip install fastdeploy-python gpu :pip install fastdeploy-gpu-python #下载部署示例代码 git cl…...
【图论】拓扑排序
一.定义 拓扑排序是一种对有向无环图(DAG)进行排序的算法,使得图中的每个顶点在排序中都位于其依赖的顶点之后。它通常用于表示一些任务之间的依赖关系,例如在一个项目中,某些任务必须在其他任务之前完成。 拓扑排序的…...
自动化备份方案
背景说明 网上有很多教程,写的都是从零搭建一个什么什么,基本上都是从无到有的教程,但是,很少有文章提及搭建好之后如何备份,这次通过请教GitHub Copilot Chat,生成几个备份脚本,以备后用。 注…...
win11出现安全中心空白和IT管理员已限制对此应用的某些区域的访问
问题 windows安全中心服务被禁用 winr 输入services.msc 找到windows安全中心服务查看是否被禁用,改为启动,不可以改动看第三条 打开设置,找到应用—windows安全中心–终止–修复–重置 重启如果还是不行看第四条 家庭版系统需要打开gped…...
github实用指令(实验室打工人入门必备)
博主进入实验室啦,作为一只手残党决定在这里分享一些常用的github使用情景和操作指南来解救其他手残党。 内容随着情景增加实时更新。如果只有没几个内容说明场景不多(相信对手残党而言是再好不过的消息) 情景一:…...
6. 激活层
6.1 非线性激活 ① inplace为原地替换,若为True,则变量的值被替换。若为False,则会创建一个新变量,将函数处理后的值赋值给新变量,原始变量的值没有修改。 import torch from torch import nn from torch.nn import …...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...


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