【C语言】编译和链接

news2024/12/27 11:30:22

在这里插入图片描述

前言:
编译和链接是计算机程序开发中的两个重要步骤,用于将源代码转化为可执行的程序。


文章目录

  • 一、翻译环境和运行环境
  • 二、翻译环境中的编译
    • 2.1 预处理(预编译)
    • 2.2 编译
      • 2.2.1 语法分析
      • 2.2.2 语法分析
      • 2.2.3 语义分析
    • 2.3 汇编
  • 三、翻译环境中的链接
  • 四、运行环境

一、翻译环境和运行环境

翻译环境: 是指在开发计算机程序时所使用的工具和设置的集合。它包括开发者用来编写、测试和调试代码的软件工具,,如文本编辑器、集成开发环境(IDE)、编译器、调试器等。
运行环境: 运行环境是指在计算机上执行已编译程序时的环境和设置。

在翻译环境中包含了编译和链接过程:
在这里插入图片描述


翻译环境:在这里插入图片描述

⼀个C语⾔的项⽬中可能有多个.c⽂件⼀起构建,那多个.c⽂件如何⽣成可执⾏程序呢?

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

二、翻译环境中的编译

编译⼜分为:预处理(或预编译)、编译、汇编三个过程。

在这里插入图片描述


2.1 预处理(预编译)

预处理是计算机程序编译过程中的第一个阶段,它主要负责对源代码文件进行一些文本处理操作,以准备将源代码转化为目标文件的过程。

  1. 宏替换:在预处理阶段,C和C++编译器会处理源代码中的宏定义,并将其替换为相应的文本。这可以通过宏展开(Macro Expansion)来实现。
#define PI 3.14159265359
double circle_area = PI * radius * radius;//圆形面积

在预处理之后,上述代码将被替换为:
double circle_area = 3.14159265359 * radius * radius;
  1. 头文件包含:#include 预处理指令用于包含其他头文件中的代码,以便在源代码文件中使用其定义的函数和变量。例如:
#include <stdio.h>
预处理会将 <stdio.h> 中的内容插入到当前源代码文件中。
  1. 条件编译:预处理允许使用条件编译指令,如 #ifdef、#ifndef、#if、#else 和 #endif,根据条件编译不同的代码块。在下一篇博客中会仔细讲解预处理指令。
  2. 移除注释:预处理器通常会移除源代码中的注释,以减小目标文件的大小。在预处理之后,注释将被完全移除。
  3. 符号替换:预处理还可以执行符号替换,将定义的符号替换为其对应的值。宏替换和符号替换与不同之处在于,符号替换指的是常量宏(只能是常量),而宏替换指的是可以代表更复杂的代码块以及常量。
#define MAX_VALUE 100//MAX_VALUE
int value = MAX_VALUE;
//预处理会将 MAX_VALUE 替换为 100

2.2 编译

编译过程中的词法分析、语法分析、语义分析和代码生成是编译器中的核心步骤,这些步骤将源代码转化为机器可执行的目标文件。

假如有以下一段代码:

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

2.2.1 语法分析

在词法分析阶段,编译器会将源代码分解成词法单元(令牌)。
上⾯程序进⾏词法分析后得到了16个词法单元:

词法单元类型
array标识符
[左方括号
index标识符
]右方括号
=赋值运算符
(左括号
index标识符
+加法运算符
4整数常量
)右括号
*乘法运算符
(左括号
2整数常量
+加法运算符
6整数常量
)右括号
;分号

2.2.2 语法分析

接下来语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树。这些语法树是以表达
式为节点的树。

在这里插入图片描述


2.2.3 语义分析

语义分析阶段检查代码中的语义错误和类型匹配。

对于这个代码片段,它可能执行以下检查:

  • 检查 array 和 index 是否已经声明。
  • 检查 index 是否为整数类型(因为它用于数组索引)。
  • 检查 index+4 和 2+6 的结果是否是整数类型。
  • 检查 array 是否支持索引操作。
  • 检查赋值运算的左边和右边的类型是否兼容。
  • 如果发现任何类型不匹配或未声明的变量,将生成相应的语义错误。

2.3 汇编

在这个阶段,编译器将生成的中间表示(通常是汇编代码)转化为目标机器的二进制机器代码,这个二进制代码可以在计算机上执行。


三、翻译环境中的链接

在编程中,链接是将多个目标文件或库文件合并成一个可执行文件或共享库的过程。链接是编译过程的最后一步,它将不同的目标文件和库文件整合在一起,以创建最终可运行的程序或共享库。

步骤包括:目标文件生成、地址和空间分配,符号决议和重定位等这些步骤。具体的不再深入讲解


四、运行环境

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

在这里插入图片描述

如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

【Audio】正弦波生成原理及C++代码

正弦波生成及频谱分析 正弦波公式 诊断系统&#xff08;Diag&#xff09;会通过播放一段指定频率、采样率、时长及振幅的正弦音&#xff0c;以此对Audio测试。正弦波的公式如下&#xff0c;其中 A是振幅、x是时间、F是频率。 y A ∗ sin ⁡ ( 2 ∗ π ∗ x ∗ F ) y A* \s…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 4. 对坐标的曲面积分(第二类曲面积分)与场论初步

文章目录 二、曲面积分2.2 对坐标的曲面积分&#xff08;第二类曲面积分&#xff09;1. 问题产生 —— 流量2. 对坐标的曲面积分的定义&#xff08;了解&#xff09;3. 对坐标的曲面积分的性质4. 对坐标的曲面积分的计算法&#xff08;1&#xff09; 二重积分法&#xff08;2&a…

properties文件和yaml文件的区别~

之前&#xff0c;关于数据库的连接信息&#xff0c;端口号的设置等&#xff0c;我们会将它分门别类的写在多个文件中&#xff0c;但SpringBoot&#xff0c;它讲究统一的配置管理&#xff0c;我们想设置的任何参数都集中在一个固定位置和命名的配置文件&#xff0c;而该配置文件…

10.4| QT实现TCP服务器客户端搭建的代码,现象

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include<QTcpServer> //服务器头文件 #include<QTcpSocket> //客户端头文件#include<QList> //链表容器 #include<QMessageBox> …

Error string: Could not load library

启动Rivz时&#xff0c;报错&#xff1a; Error string: Could not load library (Poco exception libg2o_csparse_extension.so.0.1: cannot open shared object file: No such file or directory) [ERROR] [1696572310.529059051]: Failed to load nodelet [/radar_graph_s…

破译滑块验证间距 破译sf顺丰滑块验证

废话不多说直接开干&#xff01; from selenium import webdriver # 导入配置 from selenium.webdriver.chrome.options import Options import time from PIL import Image # 导入动作链 from selenium.webdriver.common.action_chains import ActionChains import random, st…

如何获取高质量的微信私域客户?

在当今数字化时代&#xff0c;企业都在努力寻求创新的营销方式来获取更多的客户。微信私域流量作为一种精准的营销工具&#xff0c;越来越受到企业的青睐。那么&#xff0c;如何获取高质量的微信私域客户呢&#xff1f;本文将为你揭示这一难题的答案&#xff0c;让你轻松Get高转…

STM32--MQ2烟雾传感器

本文主要介绍STM32F103C8T6和烟雾传感器模块的控制算法 简介 烟雾模块选用MQ-2气体传感器&#xff0c;根据传感器的电导率随空气中可燃气体浓度的增加而增大的特性检测空气中可燃气体&#xff0c;然后将电导率的变化转换成对应的电信号 MQ系列烟雾传感分类如下&#xff1a; 该…

基于SSM的校园二手物品交易平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Python之字符串构造

Python之字符串构造 字符串str 一个个字符组成的有序的序列&#xff0c;是字符的集合使用单引号、双引号、三引号引住的字符序列字符串是不可变对象&#xff0c;是字面常量 Python3起&#xff0c;字符串都是Unicode类型 x abcde使用for循环遍历x的值&#xff0c;打印并查看…

九小场所消防安全检查安全码系统

九小场所安全码&#xff0c;实现消防安全监督管理&#xff0c;落实消防安全责任&#xff0c;形成九小场所网格化监控、动态化管理&#xff1b; 安全码流程化管理 监管部门日常检查&#xff0c;微信扫码即可填写检查记录&#xff0c;现场可拍照、视频、文字、记录检查情况&…

1200*C. Challenging Cliffs(模拟构造贪心)

Problem - 1537C - Codeforces Challenging Cliffs - 洛谷 解析&#xff1a; 排序数组&#xff0c;然后找出间隔最短的两个相邻的数 a&#xff0c;b&#xff0c;c&#xff0c;d&#xff0c;e&#xff0c;f &#xff08;假设b&#xff0c;c为差最小的两个数&#xff09;。 然后…

虫情测报灯如何实现自动化测报?

一、KH-CQPest虫情测报灯的工作过程 虫情测报灯是新一代的图像式虫情测报智能设备&#xff0c;在农业虫害防治领域拥有独特魅力&#xff0c;它内置高像素的摄像头&#xff0c;能够精准记录并将照片上传至智慧农业平台识别害虫的形态、种类。虫情测报灯运用现代光电数控集成技术…

【深蓝学院】手写VIO第2章--IMU传感器--作业

这次作业坑很多&#xff0c;作业说明的不清楚&#xff0c;摸索了很长时间才将此次作业完成&#xff0c;在这里进行记录。 1. T1 1.1 题干 1.2 解答 1.2.1 法1&#xff0c;ros related方法 不知道为什么我的launch不了&#xff0c;在imu_utils目录下面建立build后&#xff0…

剑指offer——JZ7 重建二叉树 解题思路与具体代码【C++】

一、题目描述与要求 重建二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出…

[Spring] @Bean 修饰方法时如何注入参数

目录 一、Bean 的简单使用 1、正常情况 2、问题提出 二、解决方案 1、Qualifier 2、直接写方法名 三、特殊情况 1、DataSource 一、Bean 的简单使用 在开发中&#xff0c;基于 XML 文件配置 Bean 对象的做法非常繁琐且不好维护&#xff0c;因此绝大部分情况下都是使用…

计算机竞赛 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

分析“由于找不到msvcp120.dll无法继续执行代码”的原因及解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些莫名其妙的错误提示&#xff0c;其中“由于找不到 msvcp120.dll 无法继续执行代码”就是一种常见的困扰。这种错误提示的出现往往会给用户带来一定的烦恼&#xff0c;因为不清楚究竟是什么原因导致了这个错误&#xff0c;也不…

Zabbix自定义脚本监控MySQL数据库

一、MySQL数据库配置 1.1 创建Mysql数据库用户 [rootmysql ~]# mysql -uroot -p create user zabbix127.0.0.1 identified by 123456; flush privileges; 1.2 添加用户密码到mysql client的配置文件中 [rootmysql ~]# vim /etc/my.cnf.d/client.cnf [client] host127.0.0.1 u…

【Python基础】字典和函数拓展

文章目录 前言一、字典1.1 字典是什么&#xff1f;1.2 字典的定义和操作字典的定义访问字典元素修改字典元素添加新键值对删除键值对 二、函数的拓展2.1 多返回值的函数2.2 调用函数并接收多个返回值2.3 多参数的函数2.4 函数作为参数传递2.5 示例代码 总结 前言 Python作为一…