23.(C语言)编译和链接

简介: 23.(C语言)编译和链接

可执行程序是.exe

vs2022:是一个集成开发环境

一.翻译环境

多个.c文件经过编译器,生成对应目标文件,多个目标文件和链接库一起经过链接器,生              成.exe

编译器的3步走(iOS):预处理,编译,汇编

1.预处理

2.编译

把代码变为汇编语言

2.1词法分析

将源代码程序输入扫描器,对着16个记号进行识别

2.2语法分析

通过语法分析器,对扫描产生的记号进行语法分析,从而产生语法树,语法树是以表达式为节点的树,以下面这个式子为例

2.3语义分析

通过语义分析器来完成语义分析,编译器做的是静态分析,主要是针对类型的


3.汇编

汇编器将汇编代码转化为机器可执行的指令,汇编的命令如下

4.链接

链接的时候是把一堆文件链接在一起生成可执行程序

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

例如说,函数的调用,主函数中也会储存被调用函数地址(例如记为0x0000),在将多个.c文件链接时,会发现实际上被调用函数的地址(0x0010),那么0x0010就会将0x0000删去覆盖它。

以add函数为例,链接根据引用符号add在其他模块中查找add函数的地址,然后将.c中所有引用到add的指令重新修正,让他们的目标地址为真正的add函数的地址。对于全局变量的修正也是类似的方法。这个地址修正的过程也被叫做:重定位

二.运行环境

1.程序必须载入内存中,在有操作系统的环境中执行

2.程序的执行便开始,接着便调用main函数

3.在内存上,处理各种变量,如局部全局变量,返回地址等

4.终止程序


相关文章
|
1月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
1月前
|
自然语言处理 编译器 Linux
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
42 1
|
3月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
131 1
|
1月前
|
存储 自然语言处理 编译器
C语言编译和链接
C语言编译和链接
C语言编译和链接
|
1月前
|
编译器 Linux C语言
【C语言篇】编译和链接以及预处理介绍(下篇)
【C语言篇】编译和链接以及预处理介绍(下篇)
32 1
【C语言篇】编译和链接以及预处理介绍(下篇)
|
1月前
|
自然语言处理 编译器 Linux
C语言中抽象的编译和链接原理
C语言中抽象的编译和链接原理
20 1
|
1月前
|
存储 C语言
【C语言篇】编译和链接以及预处理介绍(上篇)2
【C语言篇】编译和链接以及预处理介绍(上篇)
37 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
35 3
|
14天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
29 6