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

【C语言】编译和链接

一、编译环境和运行环境

在ANSI  C的任何一种实现中,存在着两个不同的环境:
1、翻译环境:在翻译环境中,其会通过编译和链接两个大的步骤,其中编译又分为了预处理(这        个我们后面还会详细讲解),编译和汇编,然后将源代码转换为可执行的机器指令(二进制指         令),然后生成可执行文件。

2、运行环境:就是执行环境,在运行环境中会执行可执行程序,然后输出结果。

下面我们将在翻译环境和运行环境下具体是干啥的。

二、编译环境 

编译环境就是将我们的源代码转换为可执行的机器指令,生成可执行程序,那么其是如何将源代码转换的呢?

翻译环境是由编译和链接两个大部分组成。然后其细分的话:预处理、编译、汇编三个过程。

1、编译

编译要完成的工作就是将我们的源代码转换为可执行的机器指令:

由于我们使用的编译器是一个集成开发的环境,其已经将编译的这个细节隐藏起来了,我们在运行程序的时候,其就帮我们把三个步骤都完成了。

我们可以在gcc的环境下看这个操作。

预处理:

预处理又叫预编译,在预处理的阶段,后缀为.c的文件将会被处理为.i的文件。

预处理主要做一下的事情:

1、将所有的#define删除,并展开所有的的宏定义。例如下面我们使用宏定义一个常量。

经过预处理后,那么第一个语句就会被删除,然后将这个文件的所有的N都替换成100。

2、处理所有的条件编译指令,如:#if、#ifdef、#elif、#else、#endif等等

3、处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置,

4、在预处理后,会删除那些注释,所以我们写的注释是不会影响程序的运行的。

5、添加行号和文件名标识。

6、或保留所有的#pragma的编译器指令,编译器后续会使⽤。

经过预处理后,.i文件不会再包含宏定义,当我们无法知道宏定义和包含的头文件是否正确的时候,此时我们可以查看预处理后的.i文件来确定。

编译 : 

当我们预处理后,接下来就到了编译的阶段,编译就是将预处理的文件进行:词法分析、语法分析、语义分析和优化生成相应的汇编代码文件。

例如:

arr[index] = (index+4)* (2+6);

1、词法分析:

这个阶段会将源代码程序输入到扫描器,然后扫描器就会进行简单的词法分析,将代码中的字符分割成一系列的记号这样。(关键字、标识符、字面量、特殊字符等)。

如下:

在这个阶段会简单的标记每个记号,然后生成一个记号表,这个符合表在后面链接的地方还会再进行使用的。

2、语法分析:

 到语法分析这个阶段后,其会将源代码放入语法分析器,然后对扫产生的记号进行语法分析,然后产生语法树。

如下:

其实到这个阶段,我们的代码大概的意思已经明确了。

在图上我们也可以看到这棵树的节点是一个又一个的表达式组成,如果在这个时候出现一些语法错误的话,可以很快的发现,然后程序就报错。

3、语义分析:

经过词法分析和语法分析后,就到语义分析,由语义分析器来完成语义分析,其实就表达式的具体语法层面的分析。

编译器可以做到的分析就是语义的静态分析、静态语义分析通常包括声明和类型的匹配,类型的转换等等。

如下:

 

汇编 

  经过预处理和编译阶段后,就来到汇编的阶段,在编译阶段的语义分析我们已经将源代码编译成了汇编代码,而在汇编阶段就是将翻译过来的汇编代码转换为计算机可以识别的机器指令。

在翻译的时候,每一个汇编语句几乎都对应一条机器指令,在翻译的时候不会再对代码进行啥优化的了,只会根据汇编指令和机器指令的对照表一一进行翻译,最终将汇编代码转换成了机器指令,然后生成一个.odj的目标文件。

2、链接

链接是一个非常复杂的过程,链接的时候需要将其一堆的文件链接在一块才可以生成可执行程序,链接过程主要是包括:地址和空间的分配,符号决议和重定位等这些步骤。

链接解决的是一个项目中多文件、多模块之间项目调用的问题。

如下:

我们当前的项目中有两个.c文件:

 

当我们实现好这两个文件后,直接运行看看:

 

可以看到其在我们的vs中是直接运行成功的,这是因为vs是一个集成开发的环境,其运行直接将链接的工作已经做了。

其整个过程大致为:首先先对这些.c文件进行编译,生成.odj文件,此时其相互之间是没影响的,我们需要在这个文件中使用另外一个文件的内容,那么此时就需要通过我们的链接来完成。

在链接过程中,需要使用到我们前面的词法分析时生成的符号表,将这些特殊符号记录下来,但是就是会复杂一点,其会导出符号表,未解决符号表和地址重定向表三个表。

下面为符号的类型:

1、全局符号:

      由当前模块定义并能被其他模块引用的符号

2、外部符号:

     由其他模块定义,并能被当前引用的全局符号

3、局部符号:

      由当前模块定义和引用的本地符号。

那么在上面的情况:在add.c的文件中,那么add就是全局的符号,其拥有自己的地址,然后在这个文件中没有外部的符号。
text.c文件的话,add符号被当做了外部的符号,那么在这个文件中,其是不认识add这个符号的,那么我们为了其可以正常链接,那么我们就可以在text.c中使用extern关键字对add符号进行声明,那么此时链接器就知道,这个符号在其他的文件中是有定义。

然后此时我们给在这个文件的其实是一个假的地址,先让程序继续走下去,到最后我们会为了修正text.c文件中add符号的地址,使其正确,会对其进行重定位操作,其会计算每个定义的符号在虚拟地址空间的绝对地址,然后将可执行文件中的符号引用处修改为重定义后的地址。

然后text.c文件中使用这个add.c文件中的符号的地址就是正确的了。

这就是链接中的重定位。

三、运行环境 

运行环境的要点如下:

1、程序首先必须载入到内存中去,在有操作系统的环境下,一般由操作系统完成,在独立的环境下,程序的载入必须由手工安排,也可能通过可执行代码置入只读内存来完成。

2、随后程序开始执行,其会直接调用main函数

3、开始执行程序的代码,这个时候程序就会使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程一直会保留它们的值。

4、结束程序,正常结束main函数,不过还有可能是因为错误结束。

相关文章:

【C语言】编译和链接

一、编译环境和运行环境 在ANSI C的任何一种实现中,存在着两个不同的环境: 1、翻译环境:在翻译环境中,其会通过编译和链接两个大的步骤,其中编译又分为了预处理(这 个我们后面还会详细讲解&#x…...

Spark,IDEA编写Maven项目

IDEA中编写Maven项目 1.打开IDEA新建项目 2.选择java语言,构建系统选择Maven 3.IDEA中配置Maven 注:这些文件都是我们老师帮我们在网上找了改动后给我们的,大家可自行在网上查找 编写代码测试HDFS连接 1.在之前创建的pom.xml文件中添加下列…...

【HFP】蓝牙HFP服务层连接与互操作性核心技术研究

目录 一、互操作性设计哲学 二、服务级别连接(SLC)架构设计 2.1 连接建立流程总览 2.2 核心交互时序图 2.3 关键阶段技术实现 2.4 RFCOMM连接:通信的基石 2.5 特征交换与编解码协商 2.6 指示器状态同步 三、状态同步机制深度优化 3…...

VSCode使用Remote-SSH连接服务器时启动失败glibc不符合

问题 远程主机可能不符合glibc和libstdc VS Code服务器的先决条件 原因 VSCode更新后,如果服务端GLIBC低于v2.28.0版本将不再满足需求 查看服务端GLIBC版本: ~$ ldd --version ldd (Ubuntu GLIBC 2.23-0ubuntu11.3) 2.23解决 下载V1.85版本 下载链…...

InceptionNeXt:When Inception Meets ConvNeXt论文翻译

论文名称:InceptionNeXt:WhenInceptionMeetsConvNeXt 论文地址:https://arxiv.org/pdf/2303.16900.pdf 摘要: 受视觉Transformer(ViTs)长距离建模能力的启发,大核卷积因能扩大感受野、提升模型性能而受到广泛研究与应用&#x…...

windows下,cursor连接MCP服务器

1.下载并安装node 安装后,在cmd命令框中,输入命令node -v可以打印版本号,证明安装完成 2.下载MCP服务器项目 在MCP服务器找到对应项目,这里以server-sequential-thinking为例子 在本地cmd命令窗口,使用下面命令下载…...

从零开始:使用 kubeadm 部署 Kubernetes 集群的详细指南

使用kubeadmin 部署k8s集群 目录 硬件要求 前期准备 Master 检查 API 服务器证书 清理并重新初始化 查 kubeadm 初始化日志 配置 crictl 的 endpoint 硬件要求 主机名 ip 硬件最低要求 建议,跑的块 master 10.1.1.7 2核,2G 内存给个6G node2 …...

rancher 采用ingerss ssl 部署nginx+php项目

rancher 采用ingerss ssl 部署nginxphp项目 一、创建nginx dockerfile,上传到阿里云镜像仓库(公有,不需要密码) 二、 创建php7.4 dockerfile,需要必须扩展, 上传到阿里云镜像仓库(公有&#x…...

开源聚合平台 Websoft9:开源创新已成为中小企业数字化转型、数据驱动企业的基础

引言:开源软件正在重塑企业数字化未来 根据2024年OpenLogic报告,94.57%的企业已使用开源软件,其中34.07%的机构加大了对开源技术的投入。开源软件凭借其灵活性、成本优势和生态协作能力,成为中小企业(SMB)数字化转型的…...

IntelliJ IDEA 中通义灵码插件使用指南

IntelliJ IDEA 中通义灵码插件使用指南 通义灵码(TONGYI Lingma)是阿里云推出的一款基于通义大模型的智能编码辅助工具,支持 IntelliJ IDEA 等主流 IDE。它提供了代码补全、自然语言生成代码、单元测试生成、代码注释与解释等功能&#xff0…...

如何免费使用Meta Llama 4?

周六, Meta发布了全新开源的Llama 4系列模型。 架构介绍查看上篇文章。 作为开源模型,Llama 4存在一个重大限制——庞大的体积。该系列最小的Llama 4 Scout模型就拥有1090亿参数,如此庞大的规模根本无法在本地系统运行。 不过别担心!即使你没有GPU,我们也找到了通过网页…...

introduceHLSL

最近打算好好学习一下ue的shader,跟着下面的视频,打算每天至少更新一集 https://www.youtube.com/watch?vlsXB1PQdGx0&t494s 通过下面的蓝图方式我们就可以得到一个变化的材质 alpha参数的生成实际上就是下面的式子 custom节点允许直接的写入hlsl…...

Module模块化

导出:export关键字 export var color "red"; 重命名导出 在模块中使用as用导出名称表示本地名称。 import { add } from "./05-module-out.js"; 导入: import关键字 导入单个绑定 import { sum } from "./05-module-out.js&…...

使用 Rsync + Lsyncd 实现 CentOS 7 实时文件同步

文章目录 🌀使用 Rsync Lsyncd 实现 CentOS 7 实时文件同步前言介绍架构图🧱系统环境🔧Rsync配置(两台都需安装)关闭SELinux(两台都需) 📦配置目标端(client&#xff09…...

软件工程第三章习题

一、选择题 1. (1)答案:D 解析:可行性研究是对项目在技术、经济、操作等多方面进行全面评估论证,也称为项目论证 。技术可行性研究、操作可行性研究、经济可行性研究只是可行性研究的部分内容,不能涵盖整体概念。 2. (2)答案&…...

基于ElasticSearch的向量检索技术实践

基于ElasticSearch的向量检索技术实践 作者:Tableau 原文地址:https://zhuanlan.zhihu.com/p/620260383 图片、视频、语音、文本等非结构化数据可以通过人工智能技术(深度学习算法)提取特征向量,然后通过对这些特征向量…...

Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南

Spring Boot 项目日志系统全攻略:Logback、Log4j2、Log4j与SLF4J整合指南 日志系统是应用程序不可或缺的组成部分,良好的日志实践能极大提升开发调试和线上问题排查的效率。本文将全面介绍Spring Boot项目中各种日志框架的配置与使用方案,包…...

【设计模式】责任链模式

简介 很多公司都有请假的流程,当员工提交请假申请时,请求会沿着 组长 → 经理 → CEO 的链条传递,直到有对应层级的领导处理。 适用场景 一个请求需要多个对象中的一个或多个处理(如审批流程、过滤器链)。处理对象和…...

智能气候前沿:AI Agent结合机器学习与深度学习在全球气候变化驱动因素预测

全球气候变化已成为21世纪最严峻的环境挑战,其复杂的驱动因素如温室气体排放、气溶胶浓度、野火、海冰融化以及农业和生态系统变化等,交织影响着全球的气候格局。 第一:气候变化驱动因素与数据科学基础 1.1气候变化 全球气候变化 中国碳中…...

es 原生linux部署集群

背景 目的: 1. 理解不同部署方式的架构差异 2. 对比环境配置的复杂度 3. 评估性能与资源管理 4. 探索扩展性与高可用性 5. 学习安全与隔离机制 6. 实践监控与维护 7. 掌握混合部署与云原生场景 实验的最终目标 技能提升: 全面掌握Elasticsear…...

Springboot 同时支持不同的数据库,Oracle,Postgresql

## 关键字 Java,Springboot,Vscode,支持多种数据库 ## 背景环境 我在实际项目开发工程中遇到这样一个问题,用户 A 使用 Oracle 数据库,用户 B 使用 Postgresql 数据库,但是用户 AB 都使用我们的项目。所以…...

go --- go run main.go 和 go run .

目录 go run main.gogo run .示例 go run main.go 功能:只编译和运行指定的文件(main.go),忽略同目录下的其他文件。适用场景: 当你只需要运行一个独立的文件,且该文件不依赖其他文件时。适合单文件程序或…...

关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践

以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…...

deepseek使用记录26——从体力异化到脑力异化

我们的一切发现和进步,似乎结果是使物质力量具有理智生命,而人的生命则化为愚钝的物质力量。AI快速发展的现实中,人面临着比工业革命更深刻的异化。在工业革命中,人的身躯沦为了机器的一部分,而现在人的脑袋沦为了AI的…...

Ubertool 的详细介绍、安装指南及使用说明

Ubertool:多协议网络分析与调试平台 一、Ubertool 简介 Ubertool 是一款开源的 多协议网络分析工具,专为物联网(IoT)、嵌入式系统和工业自动化领域设计。它支持蓝牙、Wi-Fi、LoRa、CAN总线等多种通信协议的实时监控、数据包捕获…...

用 HTML、CSS 和 jQuery 打造多页输入框验证功能

在网页开发中,输入框验证是至关重要的一环,它能确保用户输入的数据符合特定要求,提升交互的准确性与流畅性。今天,我们就来深入剖析一个运用 HTML、CSS 和 jQuery 实现多页输入框验证的精彩实例,带你领略前端开发中表单…...

在CentOS上安装Docker需要注意的事项

文章目录 前言Docker Engine如何设置仓库设置镜像加速器获取镜像加速器地址 写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-…...

Chrome 135 版本新特性

Chrome 135 版本新特性 一、Chrome 135 版本浏览器更新 ** 1. 第三方托管账户注册迁移到 OIDC 授权码流程** Chrome 135 将账户注册的登录页面从营销网站迁移到动态网站,同时也将 OpenID Connect (OIDC) 的隐式流程迁移到授权码流程。这样做的目的是进一步提升第…...

CMake实战指南一:add_custom_command

CMake 进阶:add_custom_command 用法详解与实战指南 在 CMake 构建系统中,add_custom_command 是一个灵活且强大的工具,允许开发者在构建流程中插入自定义操作。无论是生成中间文件、执行预处理脚本,还是在目标构建前后触发额外逻…...

K8S学习之基础七十五:istio实现灰度发布

istio实现灰度发布 上传镜像到harbor 创建两个版本的pod vi deployment-v1.yaml apiVersion: apps/v1 kind: Deployment metadata:name: appv1labels:app: v1 spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec…...

7-1 列出连通集

作者 陈越 单位 浙江大学 给定一个有 n 个顶点和 m 条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。进行搜索时,假设我们总是从编号最小的顶点…...

XML Schema 指示器

XML Schema 指示器 引言 XML Schema 是一种用于定义 XML 文档结构的语言,它能够确保 XML 文档的合法性。在 XML 文档的解析和应用中,XML Schema 指示器(XML Schema Indicator)扮演着至关重要的角色。本文将详细介绍 XML Schema 指示器的概念、作用、应用场景以及如何使用…...

Linux内核中TCP协议栈的实现:tcp_close函数的深度剖析

引言 TCP(传输控制协议)作为互联网协议族中的核心协议之一,负责在不可靠的网络层之上提供可靠的、面向连接的字节流服务。Linux内核中的TCP协议栈实现了TCP协议的全部功能,包括连接建立、数据传输、流量控制、拥塞控制以及连接关闭等。本文将深入分析Linux内核中tcp_close…...

17-产品经理-创建发布

点击“发布”-“创建发布”。 填写发布名称,选择测试的版本。还可以设置此次发布是否为“里程碑”。 点击“保存”后,进入该发布详情页面。需要为此次发布关联需求、已解决BUG、以及遗留BUG。可以通过设置条件,进行“搜索”,然后批…...

了解Spring的统一功能

目录 一、统一数据返回格式 1.引入统一数据返回格式 2.学习使用统一数据返回格式 support方法 beforeBodyWrite方法 统一数据返回格式具体逻辑 使用统一数据返回格式存在的问题 解决方法: 统一数据返回格式的优点 统一数据返回格式代码实现(包含了…...

123213

根据道路在道路网的地位、交通功能、对沿线的服务功能划分可分为快速路、主干路、次干路及支路 快速路完全为交通功能服务, 主干路以交通功能为主, 次干路是城市区域性的交通干道,为区域交通集散服务,兼有服务功能,结合主干路组成干路网 …...

通过 axios 请求回来的 HTML 字符串渲染到 Vue 界面上并添加样式

1. 通过 axios 获取数据 使用 axios 发起请求,获取返回的 HTML 字符串数据。 2. 在 Vue 中处理和渲染数据 由于 HTML 字符串中可能包含一些标签和样式,直接插入到 Vue 的模板中可能会导致样式问题。可以通过以下方式处理: 方法一&#xf…...

P1162 填涂颜色(BFS)

题目描述 由数字 0 组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2。例如:66 的方阵(n6),涂色前和涂色后的方阵如下: 如果从某个 0 出发,只向上下…...

【笔记】VS中C#类库项目引用另一个类库项目的方法

VS中C#类库项目引用另一个类库项目的方法 在 C# 开发中,有时我们需要在一个类库项目中引用另一个类库项目,但另一个项目可能尚未编译成 DLL。在这种情况下,我们仍然可以通过 Visual Studio 提供的项目引用功能进行依赖管理。 🎯 …...

进程内存分布--之smaps呈现memory-layout.cpp内存分布

上一篇介绍了:进程内存分布--之单线程代码来内存分布呈现memory-layout.cpp 这里我们使用smaps将更加形象的的体现内存分布,smaps文件是Linux的proc文件系统提供的一种可以查看内存资源使用情况的方法,Linux系统中运行的库、堆、栈等信息都可在smaps中查…...

再看自适应RAG方法:SEAKR|PIKE-RAG|DeepRAG

当大语言模型开始"怀疑人生":一场关于知识检索的AI内心戏 各位看官,今天我们要聊一个AI界的"哲学难题"——当大语言模型突然意识到自己可能是个"半瓶子醋",会发生什么奇妙反应? 想象一下这个场景:某天深夜,ChatGPT正对着用户提问"如…...

DNS服务(Linux)

DNS 介绍 dns,Domain Name Server,它的作用是将域名解析为 IP 地址,或者将IP地址解析为域名。 这需要运行在三层和四层,也就是说它需要使用 TCP 或 UDP 协议,并且需要绑定端口,53。在使用时先通过 UDP 去…...

探秘PythonJSON解析深度剖析json.loads处理嵌套JSON字符串的奥秘

哈喽,大家好,我是木头左! 在当今数字化时代,数据以各种格式呈现,而JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在众多领域广泛应用。Python作为一门强大的编程语言,其内置的json模块为处理JSON数据提供了便捷的方法。然而,当遇到像{"name&q…...

Day7 FIFO与鼠标控制

文章目录 1. harib04a例程(获取按键编码)2. harib04b例程(加快中断处理)3. harib04c例程(FIFO缓冲区)4. harib04d例程(改善FIFO缓冲区)5. harib04e例程(整理FIFO缓冲区&a…...

软件工程第一章习题

第1章软件与软件工程 1.选择题 (1)下列说法中正确的是( )o A.20世纪50年代提出了软件工程的概念 B.20世纪60年代提出了软件工程的概念 C.20世纪70年代出现了客户机/服务器技术 D.20世纪80年代软件工程学科达到成熟 (2)软件危机的主要原因是( Do B.软件生产…...

Ollama 手动高速下载Win/Linux/Mac安装包及安装方法

前言 Ollama下载速度太慢,按这个方式,速度嘎嘎的快----下载地址 手动安装 如果要从以前的版本升级,则应删除旧库。比如:sudo rm -rf /usr/lib/ollama 解压 tar -C /usr -xzf ollama-linux-amd64.tgz # 解压到/usr文件夹# 如…...

Jmeter+Jenkins+Ant自动化持续集成环境搭建

一、安装准备 1.JDK:jdk-8u121-windows-x64 2.jmeter工具:apache-jmeter-2.13 3.ANT工具:apache-ant-1.9.7-bin 4.jenkins工具:jenkins-2.32.2 二、软件安装 1.JDK的安装 >双击JDK安装包,选择安装路径(本人是…...

【11】Redis快速安装与Golang实战指南

文章目录 1 Redis 基础与安装部署1.1 Redis 核心特性解析1.2 Docker Compose 快速部署1.3 Redis 本地快速部署 2 Golang 与 Redis 集成实战2.1 环境准备与依赖安装2.2 核心操作与数据结构实践2.2.1 基础键值操作2.2.2 哈希结构存储用户信息 3 生产级应用场景实战3.1 分布式锁实…...

ISP算法.红外图像增强

在图像处理领域,常见的图像处理一般都是白光相机,实际红外相机也是常见的一种相机,它可以用来对发热的东西进行成像,也可以作为白光相机夜晚不可见的一种辅助手段,为白光相机赋能夜视能力。 红外相机的成像原理在于辐射…...

Spring Boot中使用RedisTemplate操作Redis的几种数据类型详解

Redis作为高性能的键值存储系统,在现代Java应用中扮演着重要角色。Spring Boot通过RedisTemplate为开发者提供了便捷的Redis操作方式。本文将详细介绍如何使用RedisTemplate操作Redis的五种主要数据类型。 一、RedisTemplate简介 RedisTemplate是Spring Data Redi…...