程序编译及链接
你好!感谢支持孔乙己的新作,本文就程序的编译及链接与大家分析我的思路。
希望能大佬们多多纠正及支持 !!!
个人主页:爱摸鱼的孔乙己-CSDN博客
1.翻译译环境与运行环境
当我们进行程序设计时,使用编译器、开发工具编写代码(.c文件),则需要在翻译环境,通过编译将文件中源代码转换为可执行的机器指令(二进制指令),作用于运行环境实际执行代码。
1.1.翻译环境
顾名思义,翻译环境是由编译和链接两大过程组成的,编译又可拆分为:预处理(有些书籍或许称之为预编译)、编译、汇编三个过程。
在一个包含多个.C文件的项目中,多个.C文件单独进行编译并生成对应的目标文件(Windows环境下的目标文件后缀是.obj,Linux环境下后缀是.o) 多个目标文件和链接库一起经过链接器处理生成最终的可执行程序(链接库是指运行时库支持程序运行的基本函数集合或者第三方库)
接下来,我们观察一下编译器的进程:
首先,编译过程始于源文件,通常是以.c或.cpp结尾的代码文件。接下来,这些源文件经过预处理,生成一个中间文件(通常是.i文件),在这个阶段,预处理会处理宏定义和文件包含等指令。随后,预处理后的文件被编译,生成汇编语言文件(通常是
.s
文件)。在这个过程中,编译器将源代码转换为更接近机器语言的形式。接下来是链接阶段,编译器将生成的汇编文件与标准库(如libc.a
)进行链接。链接器在这一阶段负责将所有目标文件和库文件合并,最终生成可执行文件。最后,经过链接器处理后,输出的可执行文件便是用户可以运行的最终结果。
1.2.预处理(预编译)
在预处理阶段,源文件和头文件会被处理为.i 为后缀的文件。在预处理阶段主要是处理源文件中#开始的预编译指令,处理规则如下:
• 将所有的 #define 删除,并展开所有的宏定义。• 处理所有的条件编译指令,如: #if 、 #ifdef 、 #elif 、 #else 、 #endif 。• 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。• 删除所有的注释• 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。• 或保留所有的#pragma的编译器指令,编译器后续会使⽤。
1.3.编译
编译过程就是将预处理的文件进行一系列操作:词法分析、语法分析、语义分析及优化,并生成相应的汇编代码文件。
1.3.1.词法分析
将源代码程序输入扫描器,进行简单的词法分析,把代码中字符分割成一系列的记号(关键字、标识符、字面符与特殊符号)
记号 | 类型 |
array | 标识符 |
【 | 左方括号 |
index | 标识符 |
】 | 右方括号 |
= | 赋值 |
( | 左圆括号 |
index | 标识符 |
+ | 加号 |
4 | 数字 |
) | 右圆括号 |
* | 乘号 |
( | 左圆括号 |
2 | 数字 |
+ | 加号 |
6 | 数字 |
) | 右圆括号 |
1.3.2.语法分析
1.3.3.语义分析
1.4.链接
链接作为一个复杂的过程,链接时需要把一堆文件链接在一起方可生成可执行程序。链接的过程主要包括:地址和空间分配,符号决议和重定位这些步骤;链接解决的是一个项目中多文件、多模块之间互相调用的问题。
1.5.运行环境
程序必须载入内存中,在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成;程序的执行便开始,紧接着,调用main函数,开始执行程序代码,这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值,终止程序。
相关文章:
程序编译及链接
你好!感谢支持孔乙己的新作,本文就程序的编译及链接与大家分析我的思路。 希望能大佬们多多纠正及支持 !!! 个人主页:爱摸鱼的孔乙己-CSDN博客 1.翻译译环境与运行环境 当我们进行程序设计时&…...
逻辑推理复杂推理能力评估之大模型微调(Datawhale AI 夏令营)
在逻辑推理任务中,我们采用了LoRA(Low-Rank Adaptation)技术对大模型进行微调。LoRA是一种高效的模型微调方法,通过引入低秩矩阵调整模型权重,从而实现对大型预训练语言模型的适应性调整。LoRA的主要优势包括对不同下游…...
pikachu漏洞平台~文件包含漏洞
在PHP程序中使用文件包含的对象可以被前端的用户控制且没有经过过滤或严格的定义,用户可以将其他的文件作为参数带入到PHP代码中解释执行,从而造成敏感信息泄露/程序文件读取/GetShell等危害的漏洞。 0x01文件包含漏洞 连接成功,完毕&#x…...
linux系统编程中Shell脚本配置,及man test命令手册
Shell脚本配置是指在脚本中设置各种参数、选项和环境,以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。 1. 脚本开头的配置 Shebang 第一行通常是shebang,它告诉系统使用哪个解释器来执行脚本。例如…...
【康复学习--LeetCode每日一题】572. 另一棵树的子树
题目: 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …...
OpenAI Function Call实现大模型agent自己判断用工具、上网搜索或直接大模型回答案例
参考: https://blog.csdn.net/weixin_42357472/article/details/140891660?spm=1001.2014.3001.5501 大模型用的deepseek 1)写了两个function,一个是天气工具,一个是搜索工具 2)大模型Function Call自己判断内容属于哪个工具就去调用对应工具 3)如果大模型Function Call…...
文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑源-荷不确定性的省间电力现货市场潮流风险概率评估》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...
JAVA中实现线程安全的三种方式
JAVA中实现线程安全的三种方式 1. 同步代码块2. 同步方法3. ReentrantLock4. 总结 💖The Begin💖点点关注,收藏不迷路💖 1. 同步代码块 使用synchronized关键字加在需要同步的代码块上,并指定一个锁对象。这种方式可以…...
3个二创文案生成器,让文案创作变简单
在当今数字时代,内容创作已经成为了一项非常重要的工作。无论是为了推广产品、营销服务,还是仅仅为了吸引读者,优质的文案都是至关重要的。然而,对于许多人来说,写出令人印象深刻的文案并不容易。这就是为什么二创文案…...
Java 属性拷贝 三种实现方式
第一种 List<OrederPayCustomer> orederPayCustomerList this.list(queryWrapper); List<CustomerResp>customerRespListnew ArrayList<>();for (OrederPayCustomer orederPayCustomer : orederPayCustomerList) {CustomerResp customerResp new Custome…...
C++: 如何把源码编译成SDK提供第三方使用
在我们开发过程中,经常会遇到提供SDK的情况,对于C语言,是可以方便地将源码封装成静态库或者动态库然后打包提供给第三方使用的。这样,一方面可以保护源码,另一方面也简化了对方的使用过程。 目录 一、关于动态库和静态…...
redis详细介绍
Redis是一个开源的、基于内存的高性能键值对数据库,属于NoSQL数据库的一种。它以高性能、丰富的数据结构、持久化特性、复制、集群以及发布/订阅等特性而闻名。以下是Redis的详细介绍: 一、基本介绍 名称:Redis,全称Remote Dicti…...
jar命令
文章目录 jar命令摘要 一、引言二、正文内容2.1 jar解压jar包2.2 重新打成jar包2.3 步骤2.4 sh脚本文件 jar命令 摘要 jar命令 一、引言 jar命令 二、正文内容 2.1 jar解压jar包 \# 解压 jar -xvf test.jar 2.2 重新打成jar包 jar -uvf0 marriage-admin-1.0.0.jar.j…...
CentOS上面的MySQL安装~~~保姆级教程
目录 0.声明 1.下载官网包包 2.新建文件夹,把rpm拖拽进来 3.安装yum源,查看前后变化 4.安装mysql服务 5.查看是否安装成功 6.出现报错的解决方案 7.启动MySQL 8.查看启动服务 9.配置文件 10.重新运行 11.免密码登录 12.再谈配置文件 0.声明…...
数组的复制
需求:现在有一个数组arr{1,2,3},然后有另外一个数组temp{99,100},现在需要将temp复制到arr。 java public class test1 {public static void main(String[] args) {int arr1[] new int[]{1,2,3};int temp[] new int[]{99,100};arr1 temp;System.out.p…...
Python RPA流程自动化机器人简单案例
RPA(Robotic Process Automation,机器人流程自动化)是一种通过软件机器人模拟和执行人类用户在计算机上的操作的技术。 下面是pyautogui 键盘操作的常见参数说明: https://blog.csdn.net/wydyzq12/article/details/122008396 以…...
在git中如何忽略.vscode目录?
在Git中,如果你想忽略某个特定的文件或目录(比如.vscode目录),你可以通过以下步骤来实现: 创建或编辑.gitignore文件 在项目的根目录下,如果还没有.gitignore文件,你需要创建一个。如果已经有了…...
python脚本:连接数据库,检查直播流是否可用
使用的是MySQL数据库 需要使用mysql-connector-python库来连接MySQL数据库。首先,请确保你已经安装了这个库,如果没有安装,可以通过以下命令安装: pip install mysql-connector-python假设: MySQL数据库已经配置好,并且有一个名为live_streams的表,其中包含至少两列:…...
MFC修改鼠标光标形状
1.新建项目 2.添加资源Cursor 3.添加鼠标移动响应函数,用于显示鼠标光标形状 void C修改鼠标光标View::OnMouseMove(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值CRect rc;GetClientRect(&rc);if (point.x < rc.right / …...
【英语语法】限定性定语从句与非限定性定语从句(先行词概念)
文章目录 英语语法:限定性定语从句与非限定性定语从句详解1. 限定性定语从句1.1 定义与功能1.2 使用关系代词和关系副词示例句子: 1.3 标点和语调 2. 非限定性定语从句2.1 定义与功能2.2 使用关系代词示例句子: 2.3 标点和语调 3. 区别和选择…...
web小游戏开发:2048(完)移动操作及动画效果
web小游戏开发:2048(完)移动操作及动画效果 添加随机数字游戏开始时的初始化显示分数移动和合并获取行列元素下标记录移动轨迹完整的 js小结添加随机数字 书接前文,我们在前边定义了一个 move 方法,暂时先往后放放。 在我们已经初始化好的界面上,我们需要先制作一个出现…...
pythonflaskMYSQL自驾游搜索系统32127-计算机毕业设计项目选题推荐(附源码)
目 录 摘要 1 绪论 1.1研究背景 1.2爬虫技术 1.3flask框架介绍 2 1.4论文结构与章节安排 3 2 自驾游搜索系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2.3.2 非功…...
(学习总结10)C++类和对象1
C类和对象1 一、类的定义1.类定义格式2.访问限定符3. 类域 二、实例化1.实例化概念2.对象大小 三、this指针四、C和C语言实现Stack对比 以下代码环境在 VS2022。 一、类的定义 1.类定义格式 class 为定义类的关键字,Stack 为类的名字, { } 中为类的主体…...
python 中 file.read(), file.readline()和file.readlines()区别和用法
python 中 file.read(), file.readline()和file.readlines()区别和用法 文章目录 python 中 file.read(), file.readline()和file.readlines()区别和用法1. file.read()2. file.readline()3. file.readlines()4. 总结5. 注意事项 file.read(), file.readline(), 和 file.readli…...
车辆出险报告(h5)-车辆出险记录接口-车辆相关接口
接口简介:通过vin及行驶证查询车辆出险、理赔、事故记录接口。查询成功率99%,返回URL地址的查询报告。 不能对返回的报告进行任何的修改,否则由用户自行承担相应的责任 报告结果只保留30天,如需永久保存,请您查询后自行保存 接口地…...
如何在 Next.js 中实现分页
一.介绍 分页功能可将大型数据集划分为可管理的块,从而帮助管理它们。您可以在 Next.js 的服务器端或客户端实现分页。这里有一份精简的入门指南。 1. 服务器端分页 1.1 创建 API 路由 设置 API 路由来处理分页。 // pages/api/posts.js export default async …...
Mockito基础入门
Mockito 快速入门教程 概述 Mockito 是一个流行的Java单元测试Mock框架,用于接口和数据模拟。 依赖安装 <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.12.4</version>…...
o(∩_∩)o设置代理访问博客(五)o(∩_∩)o --使用BeeWare打包应用
背景: 最近了解了一个新的打包框架BeeWare,据说他支持的平台要比nuitka更多。利用之前访问博客的脚本,来尝试一下打包windows应用程序。 BeeWare 从零开始 环境:python -m pip install briefcase 使用pycharm新建了一个名为bee…...
使用GPT-4o mini融合GraphRAG技术进行实战应用
什么是gpt-4o mini OpenAI 推出 GPT-4o mini,这是他们最具成本效益的小型模型。它的定价为每百万输入代币 15 美分,每百万输出代币 60 美分,比之前的 Frontier 型号便宜一个数量级,比 GPT-3.5 Turbo 便宜 60% 以上。目前…...
嵌入式人工智能(45-基于树莓派4B的扩展板-舵机驱动板PCA9685)
1、简介 智能小车、机械臂、摄像头云台会有多个舵机,而微控制器芯片的PWM输出引脚不够的情况下,就可以用PCA9685(16路舵机)来解决这一问题。 PCA9685是一款I2C总线控制的16通道LED控制器,专为红/绿/蓝/琥珀ÿ…...
3.11.样式迁移
样式迁移 使用卷积神经网络,自动的将一个图像中的风格应用在另一图像之上,即样式迁移(style transfer) 为了完成这一过程,我们需要两张输入图像:一张是内容图像,一张是风格图像,随后使用神经网络修…...
Spring统一返回类型中关于String的问题
文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…...
Python酷库之旅-第三方库Pandas(065)
目录 一、用法精讲 256、pandas.Series.sparse方法 256-1、语法 256-2、参数 256-3、功能 256-4、返回值 256-5、说明 256-6、用法 256-6-1、数据准备 256-6-2、代码示例 256-6-3、结果输出 257、pandas.DataFrame.sparse方法 257-1、语法 257-2、参数 257-3、功…...
Go语言标准库中的双向链表的基本用法
什么是二分查找区间? 什么是链表? 链表节点的代码实现: 链表的遍历: 链表如何插入元素? go语言标准库的链表: 练习代码: package mainimport ("container/list""fm…...
Cocos Creator2D游戏开发(9)-飞机大战(7)-爆炸效果
这个爆炸效果我卡在这里好长时间,视频反复的看, 然后把代码反复的测试,修改,终于给弄出来 视频中这段,作者也是修改了好几次, 跟着做也走了不少弯路; 最后反正弄出来了; 有几个坑; ① 动画体创建位置是enemy_prefab ② enemy_prefab预制体下不用放动画就行; ③ 代码中引用Anima…...
Redis入门概述
Redis 概述 Redis 是速度非常快的非关系型(NoSQL)基于内存的键值数据库。 键的类型只能为字符串,值可以支持五种数据类型:字符串(stirng)、列表(list)、集合(set)、散列表(hash)、有…...
Cursor搭配cmake实现C++程序的编译、运行和调试
Cursor搭配cmake实现C程序的编译、运行和调试 Cursor是一个开源的AI编程编辑器,开源地址https://github.com/getcursor/cursor ,它其实是一个集成了Chat-GPT的VS Code。 关于VS Code和VS的对比可以参考这篇文章VS Code 和 Visual Studio 哪个更好&…...
读零信任网络:在不可信网络中构建安全系统09用户信任
1. 用户信任 1.1. 将设备身份和用户身份混为一谈会导致一些显而易见的问题 1.1.1. 特别是当用户拥有多台设备时,而这种情况很普遍 1.1.2. 应该针对不同类型的设备提供相匹配的凭证 1.1.3. 在存在共用终端设备的情况下,所有的这些问题将更加凸显 1.2…...
二叉树的实现 c语言
注:层序所需的队列文件请参考 C语言 实现栈(顺序表)和队列(链表)-CSDN博客 一、 BTree.h 函数包含: // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 // 二叉树销毁 // 二叉树节点个数 // 二叉树叶子节点个数 // 二叉树第k层节点个数 /…...
【Git】如何优雅地使用Git中的tag来管理项目版本
目录 tagtag 和 branch区别操作命令打tag,当前分支标记tag提交到远程服务器删除本地tag删除远程tag切换到特定的tag查看所有tag查看标签详细信息 好书推荐 tag Git中的tag(标签)用于给项目在特定时间点(某个版本发布)…...
白骑士的PyCharm教学进阶篇 2.3 测试与自动化
系列目录 上一篇:白骑士的PyCharm教学进阶篇 2.2 高级调试技术 在现代软件开发中,测试和自动化是保证代码质量和项目稳定性的重要环节。PyCharm作为一款强大的Python IDE,提供了丰富的工具来支持单元测试和自动化测试。本篇将详细介绍单元测…...
spark写入redis报错空指针
aused by: java.lang.NullPointerException 1、spark集群 每个executor是否 与redis集群 网络策略是否通 2、写入redis的数据是否 有 null值 需要把null值 转成空字符串 3、可以用 pipleline 并行写数据...
【Material-UI】Autocomplete中的禁用选项:Disabled options
文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能,包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…...
力扣287【寻找重复数】
给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…...
学习笔记一
vector 在创建时指定初始大小和初始值: vector<int> a(5, 1) // 包含 5 个整数的 vector,每个值都为 1 可以使用 push_back 方法向 vector 中添加元素: a.push_back(7) // 将整数 7 添加到 vector 的末尾 可以使用 size(…...
星纪魅族双轮驱动遇阻:AI手机与造车梦能否照进现实?
在科技行业风起云涌的浪潮中,星纪魅族近期的一系列动作引起了广泛关注。从高层换血到全面押注AI,再到宣布造车计划,每一步都显得雄心勃勃,但深入剖析后不难发现,其未来发展之路实则布满荆棘。 星纪魅族选择“All in AI…...
深入理解 C 语言中的联合体
目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法 1.匿…...
Unity3D 物体圆周运动
Unity3D 实现一个 2D 物体沿着圆周进行运动。 物体圆周运动 前段时间在开发一个小游戏时,需要实现火箭沿着一个圆形轨道进行圆周运动。 以前面试的时候也被问到过这类问题(如何让一个 2D 物体做圆周运动),所以还是记录一下实现…...
无人机无人车固态锂电池技术详解
随着无人机和无人车技术的飞速发展,对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表,正逐步从实验室走向市场,为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池,固态锂电池在能量密度…...
策略模式的一次应用
项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …...
武磊发文力挺张玉宁 盛赞进球功臣
武磊发文力挺张玉宁北京时间11月14日22:00,世亚预18强赛C组第5轮,国足客场1-0力克巴林。赛后因伤缺席本场比赛的武磊在个人社交媒体发文盛赞了本场国足进球功臣张玉宁。武磊写到:张玉宁牛B责任编辑:卢其龙 CN070...
东北雨姐丈夫多家企业申请注销又撤回 操作引关注
东北雨姐丈夫多家企业申请注销又撤回近日,东北雨姐丈夫名下的两家合作社——本溪满族自治县榛旺现代农业发展专业合作社和本溪满族自治县圆沃现代农业发展专业合作社分别发布了简易注销公告。公告期分别为11月13日至12月2日及11月12日至12月1日。目前,这两则简易注销公告均已…...
张志敏:马斯克特朗普要对美国搞大革命?数字化文明正向我们走近?
近期世界发生最让大家震撼的事情莫过于特朗普当选,因为他这次可不是微胜,而是大获全胜:他将掌握白宫,再加上共和党已经掌控了参议院,众议院不久也将被共和党掌握,再加上最高法院9名大法官中,共和党有6位保守派大法官。现在的共和党也被人说成是特朗普党,因为特朗普通过…...
杨健、杨坤,同日被查
云南省纪委监委11月14日发布两则案件信息:云南省人大环境与资源保护委员会原副主任委员杨健涉嫌严重违纪违法,目前正接受云南省纪委监委纪律审查和监察调查。云南省大理州副州长、州公安局局长杨坤涉嫌严重违纪违法,已主动投案,目前正接受云南省纪委监委纪律审查和监察调查…...
杨紫律师回应:已完成取证
11月13日,有网友发布了有关演员杨紫相关内容,并登上了文娱热搜第一。杨紫方律师回应表示此前已经收到该用户侵犯杨紫名誉权的一审判决结果,法院要求其停止侵权、赔偿损失、赔礼道歉。针对该用户今日再次发布涉嫌侮辱诽谤的不实信息,杨紫方已完成取证,并将采取法律行动。针…...
巴黎圣母院重新开放 总统马克龙将出席仪式
巴黎圣母院重新开放据法国媒体报道,巴黎圣母院重新开放仪式定于12月7日举行,法国总统马克龙将出席。从12月8日至15日,巴黎圣母院每天下午3时30分开始对游客开放。12月15日之后,巴黎圣母院将恢复火灾前的开放时间,即早上7时45分至晚上7时。2019年4月15日,巴黎圣母院遭遇大…...