[C语言]--编译和链接

news2024/10/4 21:42:03

文章目录

目录

文章目录

前言

一、环境介绍

二、翻译环境

1.预处理(预编译)

2.编译

3.汇编

4.链接

 三、运行环境


前言

对编译和链接 进行简单的介绍


一、环境介绍

在ANSIC的任何⼀种实现中,存在两个不同的环境。

  • 翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)
  • 执行环境,它用于实际执行代码。

 

二、翻译环境

接下来我们先讲一讲翻译环境

翻译环境可以分为编译链接两大部分,其中编译又可以分解为预处理、编译、汇编三步骤

这里对上图进行解释:

  • 多个.c文件单独经过编译器,编译处理生成对应的目标文件。
  • 注: 在Windows环境下的目标文件的后缀是 .obj ,Linux环境下目标文件的后缀是.o
  • 多个目标文件和链接库⼀起经过链接器处理生成最终的可执行程序。
  • 注: 链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

当把编译器展开成3个过程,那就变成了下面的过程:

在Linux环境下,以gcc编译器来做演示

1.预处理(预编译)

在预处理阶段,源文件和头文件会被处理成为 .i 为后缀的文件。

在gcc环境下想观察⼀下,对 test.c 文件预处理后的.i文件,命令如下:

gcc -E test.c -o test.i

 预处理阶段主要处理那些源文件中#开始的预编译指令。比如:#include, #define,处理的规则如下:

  • 将所有的 #define 删除,并展开所有的宏定义
  • 处理所有的条件编译指令
  • 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置
  • 删除所有的注释
  • 添加行号和文件名标识,方便后续编译器生成调试信息等
  • 或保留所有的#pragma的编译器指令,编译器后续会使用

经过上述处理后, .i文件不再有宏定义,并且包含的头文件会被插入到.i文件中

因此我们可以通过.i文件来确认宏定义和头文件是否包含正确

2.编译

编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件

我们以如下代码进行讲解

arr[i] = i+1

首先扫描器会对源代码程序进行词法分析,将代码中的字符分成一系列记号

如:

arr : 标识符                                          ] :  右方括号                          1 : 数字

 [   : 左方括号                                      = :  赋值

 i   : 标识符                                          + : 加号

接着语法分析器会通过记号进行语法分析,生成以表达式为节点的语法树 

最后进行语法分析及优化 ,通过语义分析器,即对表达式的语法层面分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息

 

3.汇编

汇编器是将汇编代码转转变成机器可执行的指令,每一个汇编语句几乎都对应一条机器指令。就是根据汇编指令机器指令的对照表一一的进行翻译,进而生成.o文件,不再进行指令优化。

汇编的命令如下:

gcc -c test.s -o test.o

4.链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序

链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。

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

如,我们在add.c中写了个加法方法Add(),在test.c文件的主函数中调用加法方法

add.c  ->  add.o

test.c  ->  test.o

两个.o文件进行链接,形成一个符号表

 Add()的真正的地址是0x1000,所以会进行地址的修正,即重定位

至于详细内容,可以阅读<<程序员的自我修养>>来经行了解


 三、运行环境

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

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

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

相关文章

Python从入门到高手4.4节-算法实战之计算次大值

目录 4.4.1 四个随机数中的次大值 4.4.2 计算次大值的算法思路 4.4.3 使用循环计算次大值 4.4.4 祝祖国繁荣昌盛 4.4.1 四个随机数中的次大值 假设有四个整型变量&#xff0c;它们值的大小未知&#xff0c;该怎么计算出四个中的次大值&#xff1f; 次大值即第二大的数。初…

vsomeip用到的socket

概述&#xff1a; ​ vsomeip用到的socket的代码全部都在implementation\endpoints目录下面&#xff0c;主要分布在下面六个endpoint类中&#xff1a; local_client_endpoint_impl // 本地客户端socket&#xff08;UDS Socket或者127.0.0.1的socket&#xff09;local_server…

深入挖掘C++中的特性之一 — 继承

目录 1.继承的概念 2.举个继承的例子 3.继承基类成员访问方式的变化 1.父类成员的访问限定符对在子类中访问父类成员的影响 2.父类成员的访问限定符子类的继承方式对在两个类外访问子类中父类成员的影响 4.继承类模版&#xff08;注意事项&#xff09; 5.父类与子类间的转…

FTP服务原理及使用

一、配置FTP服务 配置FTP服务&#xff0c;内容不难&#xff0c;本地虚拟机上自带FTP服务程序&#xff0c;自己下载即可。 二、理解FTP的主动模式和被动模式原理 1 主动模式 客户端先开启一个大于1024的随机端口&#xff0c;用来与服务器的21号端口建立控制连接&#xff1b;当…

rabbitmq消费者应答模式

1.应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。 自动应答&#xff1a; 不在乎消费者对消息处理是否成功&#xff0c;都会告诉队列删…

win11远程连接MySQL(linux版),不需安装docker容器

不想安装虚拟机&#xff0c;想在Windows 11上运行Linux。 在win11的搜索框内&#xff0c;搜索"启用或关闭"&#xff0c;出现了“启用或关闭Windows功能”&#xff0c;双击打开。 勾选"适用于Linux的Windows子系统"&#xff0c;“虚拟机平台”&#xff0c…

网站可疑问题

目标站点 Google hack 页面访问 抓包 POST /admin.php?actionlogin HTTP/2 Host: www.xjy.edu.cn Cookie: xkm_sidA6x4Cgw2zx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0 Accept: text/html,application/xhtmlxml,appl…

AtCoder ABC373 A-D题解

ABC372 的题解没写是因为 D 是单调栈我不会(⊙︿⊙) 比赛链接:ABC373 总结&#xff1a;wssb。听说 E 很水&#xff1f;有时间我看看。 Problem A: Code #include <bits/stdc.h> using namespace std; int mian(){int ans0;for(int i1;i<12;i){string S;cin>&g…

7c结构体

文章目录 一、结构体的设计二、结构体变量的初始化2.1结构体在内存表示&#xff1b;**2.2**结构体类型声明和 结构体变量的定义和初始化只声明结构体类型声明类型的同时定义变量p1用已有结构体类型定义结构体变量p2*定义变量的同时赋初值。*匿名声明结构体类型 2.3 结构体嵌套及…

【笔记】选择题笔记408

无向图有16条边&#xff0c;其中度为4的顶点个数为3&#xff0c;度为3的顶点个数为4&#xff0c;其他顶点的度均小于3。图G所含的顶点个数至少是&#xff1a;11 总度数16232 度为2的顶点个数为x&#xff0c;度为1的顶点个数为y&#xff0c;度为0的顶点个数为z 由此可列出三元一…

工程机械车辆挖掘机自卸卡车轮式装载机检测数据集VOC+YOLO格式2644张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2644 标注数量(xml文件个数)&#xff1a;2644 标注数量(txt文件个数)&#xff1a;2644 标注…

从零开始Hadoop集群环境搭建

目录 1. Centos7.5硬件配置1.1 创建虚拟机1.2 虚拟机系统设置 2. IP地址和主机名称配置3. 软件配置3.1 安装 epel-release3.2 卸载虚拟机自带的JDK3.3 克隆虚拟机3.4 修改克隆虚拟机的IP3.5 JDK安装3.6 Hadoop安装 4. Hadoop目录结构 1. Centos7.5硬件配置 1.1 创建虚拟机 1.2…

CMU 10423 Generative AI:lec18(大模型的分布式训练)

这个文档主要讲解了分布式训练&#xff08;Distributed Training&#xff09;&#xff0c;特别是如何在多GPU上训练大规模的语言模型。以下是主要内容的概述&#xff1a; 1. 问题背景 训练大规模语言模型的主要挑战是内存消耗。 训练过程中&#xff0c;内存消耗主要来源于两个…

关于Mac管理员root权限的一些问题总结

&#x1f389; 前言 最近在学习Vue CLI的时候&#xff0c;发现在Vscode里面想要修改文件或者保存文件都会显示“permission denied”&#xff0c;即权限不足。于是想了一些解决方法&#xff0c;记录在此。 &#x1f389; 检查当前用户权限 打开终端&#xff0c;输入以下指令…

yolov8/9/10/11模型在工地安全帽检测中的应用【代码+数据集+python环境+GUI系统】

yolov8/9/10/11模型在工地安全帽检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10/11模型在工地安全帽检测中的应用【代码数据集python环境GUI系统】 背景意义 在建筑工地、矿山、工厂等工业生产环境中&#xff0c;安全帽是保护工人头部免受伤害的重要劳保工具。然而…

销售业绩飞跃,通过CRM系统激发销售团队潜力

要让销售人员使用CRM系统&#xff0c;首先需要理解他们抗拒的原因。常见的抗拒理由包括时间不足、系统复杂、缺乏培训以及对成效的怀疑。为了克服这些障碍&#xff0c;企业可以采取一系列措施&#xff0c;如提供全面培训、通过案例展示价值、强调实际收益、逐步引入系统、领导层…

C语言第15课—数据在内存中的存储

文章目录 1. 整数在内存中的存储2. 大小端字节序和字节序判断3. 整数存储练习3.1 练习13.2 练习23.3 练习33.4 练习43.5 练习5 4. 浮点数在内存中的存储4.1 浮点数存的过程4.2 浮点数取的过程 1. 整数在内存中的存储 整数的2进制表示有三种方法&#xff1a;原码、反码、补码有符…

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

37 预处理器与预处理指令、宏定义(定义常量、数据类型、替换文本、嵌套与取消)、带参宏(细节处理、与函数的区别)

目录 1 预处理器 2 预处理指令 2.1 位置 2.2 格式 2.3 换行 2.4 结束符 2.5 位置限制 3 宏定义 3.1 语法格式 3.2 使用宏定义常量 3.3 使用宏定义数据类型 3.4 宏定义的替换文本 3.5 宏定义嵌套 3.6 取消宏定义 4 带参数的宏定义 4.1 语法格式 4.2 案例演示 …

ElasticSearch学习笔记(三)Ubuntu 2204 server elasticsearch集群配置

如果你只是学习elasticsearch的增、删、改、查等相关操作&#xff0c;那么在windows上安装一个ES就可以了。但是你如果想在你的生产环境中使用Elasticsearch提供的强大的功能&#xff0c;那么还是建议你使用Linux操作系统。 本文以在Ubuntu 2204 server中安装elasticsearch 8.…