当前位置:网站首页>C语言程序之编译,链接
C语言程序之编译,链接
2022-07-17 00:11:00 【修道-0323】
前言:
曾经的“hello word”震惊的世界,让无数猿类趋之若鹜。现在就让我来谈谈对这段音符的理解吧。
音符诞生的过程
我以c/c++举例,用编译器为面板,链接器为琴弦,打造一把古筝。最后用c代码为大家波动琴弦,感受这美妙音符的诞生吧。
古筝之面板详解- 编译器
编译器的功能核心:“c语言代码 -->(预编译)–> 汇编代码 -->(编译优化)–>机器代码”
1.预编译
预处理指令包含宏定义,条件编译,头文件包含,特殊符号等;编译器会首先对预处理指令进行处理,简称预编译,预编译的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main, if , else , for , while , { , } , + , - , * , \ 等等。
预处理:
#pragma #error#pragma指令可以接参数,且根据参数内容,个数等,其功能差别很大。最常用的是指令是#pragma once,用来防止头文件重复引用。宏定义:
#define 【SrcName】 【DesName】
直接将DesName替换为SrcName,后续对于宏的使用就使用SrcName。条件编译:
#if #else #elif #endif #ifdef #ifndef
条件编译使得程序员可以选择性的编译代码段。因此,编译器将会根据条件编译语句将无用代码段过滤,不参与编译过程(即使错误也不报错)。头文件包含:
*#include <> #include ""*
使用#include的主要目的是为了让不同的源程序使用共同的变量,避免重复定义。<>主要包含“/ usr/ include”路径下的系统文件。“”主要包含程序员自定义头文件,存放路径一般与系统路径同级。特殊符号
line FILE
#line会被替换为行号,FILE被替换文件名等;
2.编译,优化
预编译得到的输出文件作为编译,优化的输入文件。通过语法,词法解析,将c代码转换为等价的汇编代码;
编译
根据预处理的输出文件,将符合语法,词法的语句翻译成等价的汇编语言;优化
编译器优化是最复杂的一个编译阶段,就细节而言,它会通过删除无效代码,删除公共表达式,削减循环强度等等方式去优化代码;就大方向而言,优化可分为对汇编代码的优化和对机器代码的优化,前者与计算机相关,后者与硬件结构密切相关。
3.汇编
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。生成的可重定位文件由数据段和代码段两个段组成。它可通过链接来创建一个可执行的或者共享的目标文件。
古筝之琴弦详解- 链接器
链接器将机器语言代码与相关文件关联(符号表解析,重定位),生成可执行文件的过程;比如函数中调用了某个头文件里面的函数或变量,就这样去链接那个头文件里及其具体实现文件。
1. 静态链接
链接器:将目标文件中的代码拷贝到最终的可执行程序中;
静态链接库:目标代码的集合;
静态链接是把相关代码拷贝到源码对应位置,参与程序生成。
2. 动态链接
在程序生成过程中,只提供正常编译需要的少量符号。在程序执行过程中,在将动态链接库中的全部内容映射到对应进程的地址空间,保证程序的正常执行调用。
古筝之弹奏- 音符诞生
总结音符诞生的四个过程如下: 预编译处理(.c) —> 编译、优化程序(.s、.asm)—> 汇编程(.obj、.o、.a、.ko) —> 链接程序(.exe、.elf、.axf等)。对于编译过程的理解,我还在门槛那里,需要多多学习。欢迎大家相互讨教,共同进步
对于GCC编译器,上述过程对应的编译指令如下:
| 名称 | GCC指令 | 结果 |
|---|---|---|
| c语言 | 无 | *.c |
| 预编译 | -E | *.i |
| 编译 | -S | *.s |
| 汇编 | -C | *.o |
| 链接 | -ld | *.exe |
边栏推荐
- C语言运算符优先级
- uniapp打包H5 空白页面 报错 Uncaught SyntaxError: Unexpected token ‘<‘
- 0章 性能平台GodEye源码分析-课程介绍
- 【pycharm】Cannot find reference ‘XXX‘ in ‘__ init__. Py 'solution
- 6章 性能平台GodEye源码分析-自定义拓展模块
- Allegro Design Entry CIS 和 Orcad Capture CIS 关系
- IEEE754标准浮点数格式
- Combined key screenshot analysis
- 利用因果线性模型监测不公平A Causal Linear Model to Quantify Edge Unfairness for Unfair Edge Prioritization
- MXNet网络模型(五)条件GAN神经网络
猜你喜欢
Mxnet network model (IV) Gan neural network

Apt get update error: hash checksum does not match

【文献阅读】Counting Integer Points in Parametric Polytopes Using Barvinok‘s Rational Functions

Hands on deep learning -- linear neural network

Learning Transferable Visual Models From Natural Language Supervision

touchID 和 FaceID~1

Hands on deep learning -- from full connection layer to convolution layer

Second order edge detection Laplacian of Guassian Gaussian Laplacian operator

One vs One Mitigation of Intersectional Bias

Learning Transferable Visual Models From Natural Language Supervision
随机推荐
Mxnet network model (V) conditional Gan neural network
Apt get update error: hash checksum does not match
常见的Go写文件方式
Allegro Design Entry CIS 和 Orcad Capture CIS 关系
频率派和贝叶斯派
监听浏览器返回操作-禁止返回上一页
6章 性能平台GodEye源码分析-自定义拓展模块
FS32K148调试之WDOG与电源模式
iFair: Learning Individually Fair Data Representations for Algorithmic Decision Making
Swift - 泛型
Mxnet network model of show me the code (III)
【文献阅读】Counting Integer Points in Parametric Polytopes Using Barvinok‘s Rational Functions
Activity的启动模式
【MySQL】windows安装MySQL 5.7
判断两个数组是否完全相等
GoogLeNet
Fair Attribute Classification through Latent Space De-biasing
Combined key screenshot analysis
记录一次海外图片加载不出来的排查
Fair Attribute Classification through Latent Space De-biasing