当前位置: 首页 > article >正文

编译和链接(以Windows,VS环境下C语言为例)

编译和链接(以Windows,VS环境下C语言为例一.什么是翻译环境和运行环境二.翻译环境2.1预处理(预编译)2.2编译2.2.1词法分析2.2.2语法分析2.2.3语义分析2.3汇编2.4链接三.运行环境提前说明一下虽然说我们是以Windows操作系统为例但是我们在细看编译的三步我们还是需要借助到Linux操作系统去学习一.什么是翻译环境和运行环境在ANSI C的任何一种实现中存在两个不同的环境第一种就是翻译环境在这个环境中源代码被转换为可执行的机器指令(二进制指令)第二种就是执行环境它用于实际执行代码紧接着下来分别细讲两种环境二.翻译环境其实在翻译环境里面分为了编译和链接两个过程而编译这个大的过程又可分为三个过程预处理编译和汇编先提前简单解释一下什么是编译和链接编译就相当于把我们平时写的.c文件通过编译器(cl.exe)编译成了.obj文件(每一个.c文件都会生成相对应的.obj)而.obj文件也可叫做目标文件紧接着链接过程就是把不同的.obj文件用链接器(link.exe)进行链接起来最后打包成一个可执行程序.exe我们需要注意的几点多个.c文件单独经过编译器编译处理生成对应的目标文件在Windows环境下的目标文件是.obj在Linux环境下目标文件的后缀是.o多个目标文件和链接库一起经过链接器处理生成最终的可执行程序链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库再以Linux下gcc编译器为例把编译再细分为三个阶段2.1预处理(预编译)在预处理阶段我们的源文件和头文件都会被处理成.i为后缀的文件我们在Linux环境下以gcc编译器为例去观察一下我们对test.c文件预处理后的.i文件代码的命令如下gcc-E test.c-o test.i//..c 后缀的源文件经过预处理后会生成 .i 后缀的预处理文件。我们在预处理阶段主要就是处理那些源文件中#开始的预处理命令 比如#include,#define,处理的规则如下将所有的#define删除并展开所有的宏定义处理所有条件的编译指令如#if#ifdef#elif#else#endif处理#include预编译指令将包括的头文件的内容插入到该预编译指令的位置这个过程是递归进行的也就是说被包含的头文件也可能包含其他文件删除所有的注释添加行号和文件名标识方便后续编译器生成调试信息等保留所有的#pragma的编译器指令编译器后续会使用经过预处理后的.i文件中不再包含宏定义因为宏定义已经被展开并且包含的头文件都被插入到.i文件中所以我们在不确定宏定义和头文件包含正确使用的时候可以查看预处理后的.i文件来确认2.2编译编译过程就是将预处理后的文件进行一系列的词法分析语法分析语义分析及优化生成相应的汇编代码文件编译过程的命令如下,就是把我们预处理后的.i文件通过编译生成.s文件(汇编代码)gcc-S test.i-o test.s接下来我们就对下面的这个代码进行编译看看在编译阶段的时候我们的词法语法分析和语义分析及优化是怎么做的array[index](index4)*(26);2.2.1词法分析所谓的词法分析是什么意思呢将源代码程序被输入扫描器扫描器的任务就是简单的进行语法分析将源代码的字符分割成一系列的记号(关键字标识符字面量特殊字符等)上面的程序进行语法分析后得到了16种记号如下所示记号类型array标识符[左方括号index标识符]边方括号赋值(左圆括号index标识符加号4数字右圆括号*乘号右圆括号2数字加号6数字右圆括号2.2.2语法分析接下来的语法分析将对扫描产生的记号进行语法分析从而产生语法树这些语法树是以表达式为节点的数2.2.3语义分析由语义分析器来完成语义分析即对表达式的语法层面分析编译器所能做的分析就是语义的静态分析静态语义分析通常包括声明和类型的匹配类型的转换等这个阶段会报告错误的语法信息2.3汇编汇编器是将汇编代码转换为机器可执行的二进制命令每一个汇编语句几乎都对应一条机器指令就是根据汇编指令和机器指令的对照表一一的进行翻译也不做指令优化汇编的命令如下gcc-c test.s-o test.o2.4链接链接是一个复杂的过程链接的过程需要把一堆文件链接成一起生成可执行程序链接过程主要包括地址和空间分配符号决议和重定位等这些步骤链接解决的是一个项目中多文件、多模块之间互相调用的问题下面举个例子在⼀个C的项目中有2个.c文件 test.c 和add.c 代码如下我们已经知道每个源文件都是单独经过编译器处理生成对应的目标文件test.c 经过编译器处理生成test.oadd.c 经过编译器处理生成add.o我们在 test.c 的文件中使用了 add.c 文件中的 Add 函数和 g_val 变量我们在 test.c 文件中每⼀次使用Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地址但是由于每个文件是单独编译的在编译器编译 test.c 的时候并不知道 Add 函数和 g_val变量的地址所以暂时把调用 Add 的指令的目标地址和 g_val 的地址搁置。等待最后链接的时由链接器根据引用的符号 Add 在其他模块中查找 Add 函数的地址然后将 test.c 中所有引用到Add 的指令重新修正让他们的目标地址为真正的 Add 函数的地址对于全局变量 g_val 也是类似的方法来修正地址。这个地址修正的过程也被叫做重定位三.运行环境程序必须载入内存中。在有操作系统的环境中⼀般这个由操作系统完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成程序的执行便开始接着便调用main函数开始执行程序代码这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和返回地址。程序同时也可以使用静态static内存存储于静态内存中的变量在程序的整个执行过程一直保留他们的值终止程序。正常终止main函数也有可能是意外终止

相关文章:

编译和链接(以Windows,VS环境下C语言为例)

编译和链接(以Windows,VS环境下C语言为例)一.什么是翻译环境和运行环境?二.翻译环境2.1预处理(预编译)2.2编译2.2.1词法分析2.2.2语法分析2.2.3语义分析2.3汇编2.4链接三.运行环境提前说明一下,虽然说我们是以Windows操作系统为例&#xff0c…...

用 shell 命令做 AI Agent 的插件系统:为什么 Hook 不是函数调用

用 shell 命令做 AI Agent 的插件系统:为什么 Hook 不是函数调用 这是 《写完一个 AI 编程助手之后,我才确定 prompt 工程不是重点》 系列的第七篇(最后一篇)。前六篇讲了进程模型、权限、并发调度、上下文压缩、记忆系统。这一篇…...

Gemini3.1Pro和GPT5.5写代码到底谁更强五类任务实测数据说

做多模型编码能力横向对比测试时用了AI模型聚合平台,一站接入两个模型方便跑同一套编码任务。Gemini 3.1 Pro在SWE-Bench Verified拿到80.6%。GPT-5.5在Terminal-Bench拿到82.7%。分数接近但写代码的实际体验和分数不是一回事。这次用五类真实开发任务做了一轮系统对…...

诚邀您参加 2026 Google Cloud Startup Day

以下文章来源于谷歌云服务,作者 Google Cloud...

不是碳基,也不是硅基!你好,我是金蝶灵基,企业AI原生操作系统!

AI是危还是机?自年初小龙虾“爆炸”以来,很多企业服务巨头都或主动或被动地陷入了深深地思考:连一直仰望并追捧的偶像——Salesforce都开始快速变革,我们能无动于衷吗?这半年以来,中国软件网注意到&#xf…...

谷歌“反重力”工具更新强行替换软件,用户恢复工作困难重重!

谷歌“反重力”工具更新强行替换软件,用户恢复工作困难重重!2026年5月21日,原本打算用“反重力”工具工作的用户,遭遇了谷歌的意外安排。前一天,谷歌在2026年I/O开发者大会上推出“反重力”工具新版本,将其…...

BBEdit 16 正式发布!新增百多项功能,部分用户可免费升级

产品 产品 BBEdit Yojimbo iPad 版 Yojimbo TextWrangler 支持 支持 BBEdit Yojimbo iPad 版 Yojimbo TextWrangler 产品下载 找回序列号 SDK 与开发者信息 公司书架 商店 商店 购物车 许可协议 Mac App Store 常见问题 销售政策 查找经销商 多用户许可证 联系我们 联系我们 找…...

uv虽快但包管理体验差:命令笨拙、更新不安全,改进之路在何方?

【uv项目承接与特点】自2023年以来,作者首次有空承接新的项目。Astral的uv在Python世界掀起热潮,它速度极快,能轻松处理Python版本,还能用一个二进制文件替代半打工具,作者之前也写过多篇关于它的文章。【uv使用体验问…...

毫米波混合波束成形技术在VR中的应用与优化

1. 毫米波VR中的混合波束成形技术解析在无线VR应用中,用户对低延迟和高带宽的需求日益增长。传统Wi-Fi标准在密集环境下难以满足这些QoS要求,而毫米波技术凭借其高传输速率和低延迟特性成为理想选择。本文将深入探讨毫米波频段下混合波束成形技术的实现原…...

8051项目代码流程图工具选择与应用指南

1. 流程图工具概述接手一个大型8051项目时,快速理解代码结构是每个嵌入式工程师都会面临的挑战。我在处理遗留代码时,第一件事就是寻找合适的流程图工具来可视化程序逻辑。市面上确实存在多种能够解析C51代码并生成流程图的软件,但选择时需要…...

量子机器学习噪声挑战与HPQS混合框架解析

1. 量子机器学习中的噪声挑战与HPQS解决方案量子机器学习(QML)作为量子计算与经典机器学习的交叉领域,正在重新定义我们处理复杂模式识别问题的方式。与传统机器学习不同,QML利用量子态的叠加和纠缠特性,理论上可以在某些特定任务上实现指数级…...

混合参数化量子态(HPQS)在量子机器学习中的应用与优化

1. 混合参数化量子态(HPQS)框架解析量子机器学习在NISQ(Noisy Intermediate-Scale Quantum)时代面临两大核心挑战:参数化量子电路(PQC)因有限测量次数导致的统计不确定性,以及神经量…...

8051仿真器OMF转SIG格式的实战指南

1. Signum 8051 仿真器符号转换器使用指南在嵌入式开发领域,Signum Systems 的 8051 仿真器是一个常用的调试工具。很多开发者在使用 Vision 开发环境时,经常遇到需要将链接器生成的绝对目标模块(OMF)转换为仿真器专用格式的需求。本文将详细介绍这个转换…...

量子纠错码与逻辑门优化实现技术解析

1. 量子纠错码与逻辑门实现基础量子纠错码是量子计算中确保计算可靠性的核心技术。与经典计算不同,量子态具有相干性和不可克隆性,这使得量子信息在存储和处理过程中极易受到环境噪声的影响。稳定子码(Stabilizer Codes)作为一类重…...

Keil µVision TAB显示异常问题分析与解决方案

1. 问题现象与背景分析在Keil Vision集成开发环境中,部分用户遇到了编辑器界面显示异常的问题。具体表现为:当代码中包含TAB字符(制表符)时,屏幕上会出现奇怪的显示错乱,原本应该显示为空白缩进的区域&…...

量子纠错码与硬件定制逻辑门的优化实现

1. 量子纠错码与硬件定制逻辑门概述量子纠错码(QECC)是容错量子计算的核心组件,其核心思想是通过编码将量子信息分布在多个物理量子比特上,利用稳定子(stabilizer)测量来检测和纠正错误。在众多QECC中&…...

Keil调试中局部变量修改限制的解决方案

1. 问题现象与背景解析在嵌入式开发过程中,调试环节往往占据整个开发周期的40%以上时间。作为Keil Vision的资深用户,我最近在调试一个基于C166架构的通信协议栈时,遇到了一个看似简单却令人困扰的问题:当我在receive_data函数内部…...

到底什么是 AI 测试?AI 测试与传统测试的区别?

过去两年,AI已经从"加分项"变成了"必选项"。 不只是大厂,二线公司、甚至传统行业的测试团队都在要求:"能熟练使用AI工具提效"。 更关键的是,面试的玩法也变了。现在的技术面试早就跳出了 “考 AI 零…...

A51汇编器Error 21解析与8051开发实践

1. 解析A51汇编器Error 21的根源与应对策略在8051单片机开发过程中,使用Keil C51工具链的A51汇编器时,开发者常会遇到一个令人困惑的报错:"ERROR #21: EXPRESSION WITH FORWARD REFERENCE NOT PERMITTED"。这个错误看似简单&#x…...

量子计算与人工智能融合:技术原理与应用前景

1. 量子计算与人工智能融合的技术全景量子计算与人工智能(AI)的交叉领域正在重塑计算技术的边界。作为一名长期跟踪量子计算发展的技术研究者,我见证了从早期理论构想到如今实验室原型机的演进历程。量子计算利用量子比特的叠加与纠缠特性&am…...

Cortex-M3/M4处理器模式判断与调试技巧

1. Cortex-M3/M4处理器模式判断原理在嵌入式开发中,理解Cortex-M3和Cortex-M4处理器的运行模式对调试和异常处理至关重要。这两种处理器架构都采用了两级特权等级和两种执行模式的组合设计:特权等级(Privilege Level):…...

开源fNIRS脑机接口帽技术解析与应用

1. 开源可穿戴fNIRS脑机接口帽技术解析在神经工程领域,功能性近红外光谱(fNIRS)技术正逐渐成为研究大脑活动的重要工具。与传统的脑电图(EEG)或功能磁共振成像(fMRI)相比,fNIRS具有独…...

迁移学习提升可穿戴设备睡眠监测精度的技术解析

1. 项目概述:迁移学习如何提升可穿戴设备的睡眠监测精度作为一名长期关注健康监测技术的从业者,我见证了可穿戴设备在睡眠监测领域的快速发展。但一个核心痛点始终存在:基于PPG(光电容积图)等外周生理信号的可穿戴设备…...

Qwen-Image-2512+LoRA:构建Godot 4.x原生像素编译工作流

1. 这不是“AI画图”,而是一次像素艺术工作流的底层重构你有没有试过在Godot 4.x里导入一张Stable Diffusion生成的“像素风”图,结果放大一看全是模糊的伪像素、边缘发虚、色阶溢出,连8-bit调色板都对不上?我去年帮三个独立游戏团…...

Python循环语句从入门到精通:for和while核心用法详解

编程里,循环属于绕不开的基础操作,Python当中,for与while看似简单,然而不少人写着写着就会卡住,特别是在嵌套、break以及continue的配合方面容易出错。本文助力你理清这两种循环的核心逻辑,结合实际场景讲透…...

BarrageGrab:构建企业级直播弹幕实时采集系统的技术架构与实践指南

BarrageGrab:构建企业级直播弹幕实时采集系统的技术架构与实践指南 【免费下载链接】BarrageGrab 抖音快手bilibili直播弹幕wss直连,非系统代理方式,无需多开浏览器窗口 项目地址: https://gitcode.com/gh_mirrors/ba/BarrageGrab 在直…...

魔兽争霸3终极兼容方案:5分钟解决Win10/Win11运行问题

魔兽争霸3终极兼容方案:5分钟解决Win10/Win11运行问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代Windows系统上…...

如何重新定义华硕笔记本性能管理:探索G-Helper的轻量化解决方案

如何重新定义华硕笔记本性能管理:探索G-Helper的轻量化解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Ze…...

UDS_自动化脚本生成_10服务_V01

1、原子元素 1.1 会话原子 Session.Default() Session.Extended() Session.Programming() Session.Developer() 1.2 请求原子 10 01 10 02 10 03 10 76 10 81 10 82 10 83 10 F6 10 04 10 84 10 / 10 01 00 / 10 02 00 / 10 03 00 / 10 76 00 1.3 响应原子 50 01 00 32 01 F4 …...

Frida-ps -U 连接失败的五层排查法

1. 这不是 Frida 的问题,是你的设备和 Frida 之间“没对上暗号” 你执行 frida-ps -U ,终端卡住三秒,然后甩出一句 Failed to enumerate processes: timeout was reached ——这行报错我见过太多次了。它不像编译错误那样指向某一行代码…...