当前位置:网站首页>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 |
边栏推荐
- touchID 和 FaceID~1
- Problems encountered in yolov3 training its own data set
- 【文献阅读】VAQF: Fully Automatic Software-Hardware Co-Design Framework for Low-Bit Vision Transformer
- Windbos download and install openssh
- rotoc-gen-go: unable to determine Go import path for **.proto
- apt-get update报错:Hash 校验和不符
- IEEE754标准浮点数格式
- Laravel之文件上传
- 防抖debounce和节流throttle的使用
- windwos 下载安装OpenSSH
猜你喜欢
![[literature reading] mcunet: tiny deep learning on IOT devices](/img/67/21e5c6b7cf95073850be4c7c20520c.png)
[literature reading] mcunet: tiny deep learning on IOT devices

Hands on deep learning -- multi layer perceptron (MLP)

AURIX Development Studio安装

1章 性能平台GodEye源码分析-整体架构

Second order edge detection Laplacian of Guassian Gaussian Laplacian operator

IGBT 直通短路过程问题分析

Fair Multiple Decision Making Through Soft Interventions

Neutralizing Self-Selection Bias in Sampling for Sortition

windwos 下载安装OpenSSH

S32K148EVB 关于ENET Loopback实验
随机推荐
openGauss Developer Day 2022|东方通诚邀您莅临“东方通生态工具分论坛”
2章 性能平台GodEye源码分析-数据模块
wkwebview白屏
cookie、LocalStorage、sessionStorage三者区别以及使用方式
【pycharm】Cannot find reference ‘XXX‘ in ‘__ init__. Py 'solution
Apt get update error: hash checksum does not match
[踩坑]packets.go:428: busy buffer invalid connection
动手学深度学习--线性神经网络篇
Handling conditional discrimination
Hands on deep learning -- multi layer perceptron (MLP)
Boost thread pool
Ace download address
[go language] code coverage test (Gcov)
【Go语言】代码覆盖测试(gcov)
Show Me the Code之MXNet网络模型(三)
[literature reading] counting integer points in parametric polymers using barvinok's rational functions
ResNet
二階邊緣檢測 - Laplacian of Guassian 高斯拉普拉斯算子
One vs One Mitigation of Intersectional Bias
[literature reading] isl: an integer set library for the polygonal model