【C语言】链接与编译(编译环境 )

前言:

在前面讲解文件操作,了解了文件的类别,文件的打开与关闭,字符读写函数, 字符串读写函数,格式化输入输出函数

在C语言编程中,编译与链接是将源代码转化为可执行程序的关键步骤。为了详细讲解这些过程及其相关知识点,我们将从以下几个方面展开,并结合实例进行说明:

环境

对C语言而言,生成程序的过程中存在两种环境:翻译环境 与 运行环境

  • 翻译环境:负责将C语言源代码转化为机器指令。这一过程包括预处理、编译、汇编和链接四个阶段。
  • 执行环境:运行编译后生成的可执行程序,通常依赖于操作系统和硬件资源

翻译环境

在翻译环境中,源代码会被转化为可执行的机器指令。这个过程会分为编译链接两大步。

 其中,编译分为:预处理,编译,汇编三个小步骤。而链接则是将多个.c文件与链接库进行链接,从而生成可执行程序。链接库,可以简单理解为库函数存储的地方,比如printf就需要链接到外部的库函数。

C程序编译过程与ELF可执行文件及gcc常见编译选项_c lion怎么编程elf文件-CSDN博客

编译

编译分为:预处理编译汇编三小步,接下来我们看看每一个阶段都什么作用。。

预处理

预处理阶段主要处理源代码中的预处理指令,如宏定义、文件包含和条件编译等。例如:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

在预处理阶段,MAX宏会被展开为相应的表达式。 

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

在预处理阶段,MAX宏会被展开为相应的表达式。

示例
假设代码包含以下内容:
#include <stdio.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {int x = 10, y = 20;printf("Max value is: %d\n", MAX(x, y));return 0;
}

经过预处理后,MAX宏被展开为:

int main() {int x = 10, y = 20;printf("Max value is: %d\n", ((x) > (y) ? (x) : (y)));return 0;
}

Linux 高级编程 - 必备的 gcc 基础 登龙(DLonng)

预处理阶段会发生以下操作:

  1. 将头文件展开
  2. 删除#define指令,并执行宏的替换
  3. 删除注释代码

编译

在编译阶段,.i会被处理成为.s为后缀的⽂件

  • 词法分析:将源代码字符串分解成一系列的单词或符号(Token),如关键字、标识符、字面量、操作符等。
  • 语法分析:根据语言的语法规则,将Token串转换成一个体现语法规则的树状数据结构,即抽象语法树(AST)。这一步验证了源代码是否符合语言的语法规则。
  • 语义分析:在语法分析的基础上,进一步理解代码的含义,如变量类型、表达式求值等,并建立符号表以存储变量的作用域、类型等信息。
  • 中间代码生成:将AST转换为一种中间表示形式(IR),以便于后续的优化和跨平台执行。
  • 代码优化:对中间代码进行优化,以提高程序的运行效率。优化可能包括删除无用的代码、循环优化、常量折叠等。
  • 目标代码生成:将优化后的中间代码转换为汇编代码。这一步生成了特定于机器的代码,但尚未转换为机器语言指令。

以以下代码为例:

编译阶段将预处理后的代码转换为汇编语言,并进行语法分析、语义分析和优化。例如:

int add(int a, int b) 
{return a + b;
}

编译器会生成对应的汇编代码,如:

add:push ebpmov ebp, espmov eax, [ebp+8]add eax, [ebp+12]pop ebpret

示例
假设代码包含以下内容:

int square(int x) 
{return x * x;
}

编译后生成的汇编代码可能如下:

square:push ebpmov ebp, espmov eax, [ebp+8]imul eax, eaxpop ebpret

C语言 — 必学的编程基础语法,入门就从这里开始!_编程语法_C语言编程俱乐部的博 …

汇编

汇编阶段将汇编代码转换为机器语言目标文件(如.o文件)。例如:

section .text
global _start_start:mov eax, 1xor ebx, ebxint 0x80

汇编器会生成对应的机器码。

示例
假设代码包含以下内容:

section .text
global _start_start:mov eax, 1xor ebx, ebxint 0x80

汇编器生成的目标文件可能如下:

00000000 <_start>:0:   b8 01 00 00 00          mov    $0x1,%eax5:   31 db                 xor    %ebx,%ebx7:   cd 80                 int    $0x80

程序编译工具基础 - 知乎

链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是

例如:

// file1.c
int add(int a, int b) {return a + b;
}

⼀个项⽬中多⽂件、多模块之间互相调⽤的问题

int main() {int result = add(5, 3);printf("Result: %d\n", result);return 0;
}

两个文件分别编译生成目标文件file1.ofile2.o,然后通过链接器将它们链接成可执行文件。

 

链接的大致过程就是:

先给外部变量一个假的地址,然后再在链接的时候,将所有假地址修正。

我们下章再见吧!!!! 

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

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

相关文章

Java视频流RTMP/RTSP协议解析与实战代码

在Java中实现视频直播的输入流处理&#xff0c;通常需要结合网络编程、多媒体处理库以及流媒体协议&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是实现视频直播输入流的关键步骤和技术要点&#xff1a; 1. 视频直播输入流的核心组件 网络输入流&#xff1a;通过Socket或…

系分论文《论系统需求分析方法及应用》

系统分析师论文范文系列 【摘要】 2022年6月&#xff0c;我作为系统分析师参与了某金融机构“智能信贷风控系统”的建设项目。该系统旨在通过对业务流程的数字化重构&#xff0c;优化信贷审批效率并降低风险。项目涉及信贷申请、资质审核、风险评估、额度审批等核心流程&#x…

stack和queue简单模拟实现

stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…

Linux内核可配置的参数

sysctl -a 命令会列出当前Linux内核所有可配置的参数及其当前值。这些参数允许你在系统运行时动态地调整内核的行为&#xff0c;而无需重新编译内核或重启系统。 内容非常多&#xff0c;因为内核有很多可调的方面。我们可以把它们大致分为几个主要类别&#xff1a; kernel.*: …

【背包dp-----分组背包】------(标准的分组背包【可以不装满的 最大价值】)

通天之分组背包 题目链接 题目描述 自 01 01 01 背包问世之后&#xff0c;小 A 对此深感兴趣。一天&#xff0c;小 A 去远游&#xff0c;却发现他的背包不同于 01 01 01 背包&#xff0c;他的物品大致可分为 k k k 组&#xff0c;每组中的物品相互冲突&#xff0c;现在&a…

操作系统:os概述

操作系统&#xff1a;OS概述 程序、进程与线程无极二级目录三级目录 程序、进程与线程 指令执行需要那些条件&#xff1f;CPU内存 需要数据和 无极 二级目录 三级目录

RAG文本分块

不论是向量化模型还是大语言模型&#xff0c;都存在输入长度的限制。对于超过限制的文本&#xff0c;模型会进行截断&#xff0c;造成语义缺失。分块可以确保每个文本片段都在模型的处理范围内&#xff0c;避免重要信息的丢失。 文本分块的核心原则 高质量分块的核心原则是&a…

2025 年九江市第二十三届中职学校技能大赛 (网络安全)赛项竞赛样题

2025 年九江市第二十三届中职学校技能大赛 &#xff08;网络安全&#xff09;赛项竞赛样题 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&#xff09;A-1 任务一登录安全加固&#xff08;Windows,Linux&#xff09;A-2 任务二 Nginx 安全策略&…

量子隧穿:PROFINET到Ethernet ip的无损耗协议转换方案转

在本季度的生产工作中&#xff0c;我们成功实现了仓储物流自动化分拣系统中的关键技术突破。我们面临的主要挑战是将采用EtherNet/IP协议的输送带控制器与PROFINET协议的上位系统进行有效通信。通过引入ethernet IP转PROFINET网关倍讯科技BX-606-EIP&#xff0c;我们实现了输送…

OpenCV CUDA模块中矩阵操作------降维操作

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::reduce 函数用于对 GPU 上的矩阵沿某个维度进行降维操作&#xff0c;例如求和、取最大值等。此函数支持多种降维操作&#xff0c;并允…

一分钟用 MCP 上线一个 贪吃蛇 小游戏(CodeBuddy版)

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 你好&#xff0c;我是悟空。 背景 上篇我们用 MCP 上线了一个 2048 小游戏&#xff0c;这次我们继续做一个 …

简单神经网络(ANN)实现:从零开始构建第一个模型

本文将手把手带你用 Python Numpy 实现一个最基础的人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;。不依赖任何深度学习框架&#xff0c;适合入门理解神经网络的本质。 一、项目目标 构建一个三层神经网络&#xff08;输入层、隐藏层、输出层&#xf…

使用python进行人员轨迹跟踪

一、系统概述 该系统基于计算机视觉技术&#xff0c;实现对视频或摄像头画面中的人员进行检测、跟踪&#xff0c;并生成轨迹数据。支持透视变换校准&#xff08;鸟瞰图显示&#xff09;、多目标跟踪、轨迹存储及视频录制功能&#xff0c;适用于安防监控、行为分析等场景。 二…

[强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程

本人为强化学习小白&#xff0c;为了在后续科研的过程中能够较好的结合强化学习来做相关研究&#xff0c;特意买了西湖大学赵世钰老师撰写的《强化学习数学原理》中文版这本书&#xff0c;并结合赵老师的讲解视频来学习和更深刻的理解强化学习相关概念&#xff0c;知识和算法技…

Docker入门指南:镜像、容器与仓库的核心概念解析

目录 前言&#xff1a;为什么需要Docker&#xff1f; 一、Docker能做什么&#xff1f; 二、核心概念解析 1. 镜像&#xff08;Image&#xff09;&#xff1a;应用的标准化打包 2. 容器&#xff08;Container&#xff09;&#xff1a;镜像的运行实例 3. 镜像仓库&#xff0…

大模型微调实战:基于GpuGeek平台的低成本高效训练方案

文章目录 引言一、GpuGeek平台使用入门1. 注册与账号设置2. 控制台功能概览3. 快速创建GPU实例3. 预置镜像与自定义环境 二、GpuGeek平台核心优势解析1. 显卡资源充足&#xff1a;多卡并行加速训练2. 镜像超多&#xff1a;开箱即用的开发环境3. 计费灵活&#xff1a;按需付费降…

Linux:计算机的层状结构

1.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本、台式机。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系结构。 CPU&#xff1a;运算器和控制器组成。运算器主要工作是做算术运算和逻辑运算。控制器主要工作是协调设备之间信息流动的…

LangGraph(四)——加入人机交互控制

目录 1. 引言2. 添加Human Assistance工具3. 编译状态图4. 提示聊天机器人5. 恢复执行参考 1. 引言 智能体可能不可靠&#xff0c;甚至需要人工输入才能完成任务。同样&#xff0c;对于某些操作&#xff0c;你可能需要在运行前获得人工批准&#xff0c;以保证一切按预期运行。 …

数据结构【AVL树】

AVL树 1.AVL树1.AVL的概念2.平衡因子 2.AVl树的实现2.1AVL树的结构2.2AVL树的插入2.3 旋转2.3.1 旋转的原则 1.AVL树 1.AVL的概念 AVL树可以是一个空树。 它的左右子树都是AVL树&#xff0c;且左右子树的高度差的绝对值不超过1。AVL树是一颗高度平衡搜索二叉树&#xff0c;通…

JavaScript【5】DOM模型

1.概述&#xff1a; DOM (Document Object Model)&#xff1a;当页面被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff0c;即dom对象&#xff1b;dom对象会被结构化为对象树&#xff0c;如一个HTML文档会被分为head&#xff0c;body等部分&#xff0c;而每个部分又…