C语言的编译和链接

news2024/11/23 20:35:10

每日一言

要保持希望在每天清晨太阳升起。 --自己


前言

当我们写下C语言代码(源文件、以.c为后缀)的时候,他需要经过一个翻译环境,被处理后形成一个可执行程序(以.exe为后缀)。形成的这个可执行程序里面放的都是二进制信息,它可以被机器读懂
(全文都在Windows环境下)

什么是翻译环境

翻译环境(Translation Environment)是指用于将源代码翻译为目标代码的一系列工具和软件组成的环境。它其实是由编译和链接两个大的过程组成的,而编译又可以分为:预处理、编译、汇编三个过程。

编译

源文件经过编译器编译后,形成一个目标文件(以.obg为后缀)
在这里插入图片描述

预处理

预处理器是执行预处理的工具,它根据预处理指令(以#开头)对源代码进行处理。

预处理的主要作用有:

  1. 文件包含:使用预处理指令#include可以将一个文件的内容插入到另一个文件中。这是C语言中模块化编程的一种方式,可以将功能相关的代码组织在不同的文件中,并通过包含文件来使用这些代码。

  2. 宏替换:使用#define指令可以定义宏,预处理器会在编译之前扫描源代码,将代码中出现的宏名称替换为对应的宏定义。宏替换可以简化代码,提高代码的可读性和维护性。

  3. 条件编译:使用#if#ifdef#ifndef等条件指令可以根据条件编译不同的代码。通过条件编译,我们可以根据不同的平台、编译选项或宏定义来选择性地编译不同的代码块。

  4. 注释删除:预处理器会将源代码中的注释删除,这样在编译阶段就不会再考虑这些注释了。

预处理是在编译之前进行的,它处理的是纯文本的源代码,生成的是经过预处理后的代码。预处理阶段的结果会成为编译器的输入,在编译器对处理后的代码进行词法分析、语法分析和语义分析等操作后,生成最终的目标代码。

编译

在预处理阶段之后,编译器会对经过预处理的源代码进行词法分析、语法分析、语义分析等处理,然后生成目标代码。

  1. 词法分析:将源代码分解成一个个的标记,如关键字、标识 符、运算符等。词法分析器会扫描源代码并生成标记序列供后续的语法分析使用。
  2. 语法分析:根据所使用的语法规则,将标记序列生成语法树。语法分析器会遵循语法规则检查源代码的语法是否正确,并生成语法树用于语义分析。
  3. 语义分析:对语法树进行静态语义检查,包括类型检查、作用域分析等。语义分析器会检查标识符的使用是否正确,进行类型推导和类型转换等操作。

汇编

汇编器的主要任务是将汇编语言代码转换为机器指令。就是根据汇编指令和机器指令的对照表一一的进行翻译,也不做指令优化。

链接

链接是将多个目标代码文件或库文件合并成一个可执行文件的过程。
链接的主要任务是将所有的目标代码文件合并,并解决函数和变量的引用关系。

  1. 符号解析:在目标代码中,各个函数和变量使用符号来表示。链接器会遍历所有目标代码文件,通过符号表来解析函数和变量的引用关系。

  2. 地址重定位:在链接过程中,各个目标代码文件的地址空间是相互独立的,需要进行地址的重定位。链接器会根据每个目标代码文件在内存中的位置,调整代码中的地址引用,使其正确指向目标地址。

  3. 文件合并:链接器会将所有目标代码文件中的可执行代码和数据段合并成一个整体。这涉及到对各个目标代码文件的段进行合并和对齐操作。

  4. 符号解析与重定义:在链接过程中,可能会遇到多个目标代码文件中定义了相同的函数或变量。链接器会解析这些符号,并根据一定的规则进行重定义,以确保每个符号只有一个定义。

  5. 库文件链接:除了链接目标代码文件外,链接器还可以将库文件链接到可执行文件中。库文件中包含了一组已编译好的函数和变量的实现,通过链接库文件可以避免重复编写相同的代码。

运行环境

  1. 程序必须载入内存中,在有操作系统的环境中:一般由这个操作系统完成,在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成
  2. 程序的执行便开始,接着便调用main函数
  3. 开始执行程序代码,这个时候程序将使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程中一直保留他们的值
  4. 终止程序,正常终止main函数;也有可能是意外终止。

结语

本文只介绍了一点点皮毛,如果读者有兴趣可以去读一读:《程序员的自我修养》《编译原理》
请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1400842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器】搭建一台属于自己的服务器

​🌈个人主页:Sarapines Programmer🔥 系列专栏:【服务器】搭建网站⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 目录 1. 购买服务器和域名 1.1 购买服务器 1.1.1 阿里云服务器 1.1.2 香草云服务器 1.2 购买域名 2. 安装宝塔…

matlab抽取与插值

什么是抽取? 我们假设一个数字信号 x ( n ) , n 1 , 2 , . . . , N x(n),n1,2,...,N x(n),n1,2,...,N共有 N N N个点,抽取就是每个几个点抽1个点,比如2倍抽取,那么抽取后的信号为 y ( n ) , y ( 1 ) x ( 1 ) , y ( 2 ) x ( 3 …

WebSocket-黑马好客租房

文章目录 网站中的消息功能如何实现?什么是WebSocket?http与websocket的区别httpwebsocket 浏览器支持情况快速入门创建itcast-websocket工程websocket的相关注解说明实现websocket服务测试编写js客户端 SpringBoot整合WebSocket导入依赖编写WebSocketHa…

Python实现M-Estimators稳健线性回归模型(RLM算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 M-Estimators 是稳健统计估计中的一个重要概念,它们在处理含有异常值、离群点或者影响点的…

GPT应用_AutoGPT

项目地址:https://github.com/Significant-Gravitas/AutoGPT 1 功能 1.1 整体功能,想解决什么问题 单独使用 ChatGPT 时,只提供基本的聊天,无法实现复杂多步的功能,以及与其它应用交互,如果想提供某种功…

【开源】基于JAVA的停车场收费系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

【微服务】springcloud集成sleuth与zipkin实现链路追踪

目录 一、前言 二、分布式链路调用问题 三、链路追踪中的几个概念 3.1 什么是链路追踪 3.2 常用的链路追踪技术 3.3 链路追踪的几个术语 3.3.1 span ​编辑 3.3.2 trace 3.3.3 Annotation 四、sluth与zipkin概述 4.1 sluth介绍 4.1.1 sluth是什么 4.1.2 sluth核心…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节,以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源(如太阳能、风能、储能等)和负载(如建筑、工业设备等&…

NLP论文阅读记录 - 2021 | WOS 使用预训练的序列到序列模型进行土耳其语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1 预训练的序列到序列模型2.2 抽象文本摘要 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结…

STM32 Hal库FreeRtos查看所有任务的内存栈信息使用情况剩余空间 仅需一个函数搞定 超简单

STM32F103 基于Hal库跑FreeRtos,查看所有任务的栈的信息,包括任务名,任务状态,任务优先级,空闲栈,任务号。 运行结果如下 只需要使用一个函数vTaskList :获得任务的统计信息,形式为…

【leetcode】移除元素

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一.暴力求解法二.使用额外数组三.原地修改数组 点击查看题目 一.暴力求解法 若我们不考虑时间复杂度…

AI视频智能识别技术在智慧农业大棚升级改造管理场景中的应用方案

一、需求分析 随着科技的进步和农业现代化的推进,智能化技术逐渐成为现代农业发展的重要支撑。农业大棚作为现代农业的重要组成部分,其智能化改造对于提高农业生产效率、降低成本、增加收益具有重要意义。利用先进的信息化手段来对农业大棚进行管理&…

复合材料压缩过程中引入屈曲变形前后的对比

振动模态: 压缩过程(不考虑屈曲引入) 在45KN出现拐点,在30步。 30步,压缩时的面外位移,与一阶模态类似;31步已经不正常。在快破坏前几步与一阶模态很相似。 30步树脂拉伸只是零星出现 …

CSS之高度塌陷和外边距塌陷

目录 1.高度塌陷(原因,如何解决) 【概念介绍】 【解决办法】 【概念介绍-BFC】 【拓展-BFC的触发条件】 2.外边距塌陷 (原因,如何解决) 【概念介绍】 【两种情况】 1.相邻块元素 2.嵌套块元素 【…

【arthas诊断线上java应用】

背景: 想起来之前的面试,有一次问到:假如线上出现cpu飙升,和内存问题,如何排查?当时我只用过jprofiler,现在想想这个玩意是要占用一个端口的,而且会影响服务器的性能,适…

解决ssh登录Permission denied, please try again

现象截图如下: 确定root的密码是正确的,最后的原因找到了,是远程的服务器,禁用了root账户可以被远程访问的权限。开启操作如下: 1.编辑配置文件 vi /etc/ssh/sshd_config 2.文件中找到PermitRootLogin #PermitRoo…

计算机网络基础概念解释

​ 1. 什么是网络 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同⼯作来完成业务,于是有了网络互连。 网络互连:将多台计算机连接在⼀起,完成数据共享。 数据共享本质是…

Rockchip linux USB 驱动开发

Linux USB 驱动架构 Linux USB 协议栈是一个分层的架构,如下图 5-1 所示,左边是 USB Device 驱动,右边是 USB Host 驱动,最底层是 Rockchip 系列芯片不同 USB 控制器和 PHY 的驱动。 Linux USB 驱动架构 USB PHY 驱动开发 USB 2…

新买电脑配置不低却卡顿?

目录 前言: 电脑卡顿的原因 Windows 10必做的系统优化 禁用 IP Helper 关闭系统通知 机械硬盘开启优化驱动器功能 开启存储感知 前言: 新买的电脑配置不低,但却卡顿甚至程序不反应,这是怎么回事儿? 其实并不…

139基于matlab多旅行商MTSP问题

基于matlab多旅行商MTSP问题,利用遗传算法求解多旅行商问题的算法设计,输出MTSP路径。相互独立路径,同一起点路径。程序已调通,可直接运行。 139 matlab多旅行熵M-TSP (xiaohongshu.com)https://www.xiaohongshu.com/explore/65ab…