当前位置: 首页 > news >正文

小解C语言文件编译过程【linux】

小解C语言文件编译过程【linux】

    • 动态库
    • 静态库
  • C语言文件 程序编译过程
    • 整体
      • 预处理
      • 编译
      • 汇编
      • 链接
        • 动态链接
        • 静态链接
        • 两种方法对比

看到标题是文件编译过程
但是开头却是库,这可不是挂羊头卖狗肉,而是因为库也是代码不可缺少的一部分并且在编译过程中需要进行处理

那我们首先需要知道什么是库?

还记得我们写C语言时候,如果用到printf等函数,需要包上stdio的头文件吗
包上头文件后我们就能正常使用函数了
但是实际上,头文件中,只有函数的声明,而没有函数的实现和定义

那实现代码在哪呢?
就是在库中。

但是我们在写代码的过程中,并没有导入库
而导入库就是编译的过程中的部分了。

现在先来讲库的种类。

动态库

linux
动态库 .so
win
动态库:.dll

静态库

linux:
静态库 .a
windows
静态库:.lib

库的类型区分,主要体现在导入的方法中。

所以接下来进入编译过程的解读。

C语言文件 程序编译过程

大家都知道,对于计算机来说,只认识二进制码
那我们用了这么久的C语言,大家可能对C语言是如何转化成机器语言优点不太熟悉
所以这里就用linux系统,来带大家来认识一下C程序的编译过程

这里为了讲解就随便用了一个写了一个.C文件

#include<stdio.h>
#define max 10
int main()
{printf("%d\n",max);return 0;
}

整体

大致流程如图
在这里插入图片描述
接下来我们分别来看一下每个步骤:

预处理

预处理主要是将程序中的头文件展开以及宏定义和特殊符号进行处理

在linux中我们可以用

gcc -E test.c -o test.i

进行执行

这里的-E代表的意思是执行预处理指令
预处理结束后,会生成.i的文件
但是这里为了方便就直接重命名成test.i了
在这里插入图片描述
这里多了test.i文件
在这里插入图片描述
在test.i文件内部,我们能发现已经将stdio的头文件进行了展开
在这里插入图片描述
我们的写的代码还未进行处理

编译

编译:检查C语言程序语法,并将其转化为汇编语言。
可以用:

gcc -S test.i -o test.s

这个指令是要求test.c文件执行编译步骤

结束后会生成.s文件

在这里插入图片描述
我们通过cat指令
能看到test.c内部是汇编语言

汇编

汇编:将汇编语言转化为二进制码

通过一下代码执行至汇编部分

gcc -c test.s -o test.o

但是将代码转化为计算机认识的二进制码以后,也还没结束
还有最后一步。

链接

链接:将二进制码与程序所需的库相链接

库已经在上面进行了解释

gcc test.o -o test

这里就是最后一步了,成功生成了test的可执行程序

但是其实,链接还有两种情况,记得我们上面讲的静态库和动态库

链接的作用是将库和文件链接
那既然有两种库,那就有两种链接方式。

动态链接

动态链接就是链接动态库
动态库链接方式其实就是我们上面的

gcc test.o -o test

就是说默认的链接方式就是动态链接

那动态链接是如何使用库的呢?
通俗的讲就是:需要用到库的时候自己去库里面找

留下了函数对应的接口,之后需要使用库的内容的时候,直接去原库中去寻找。

静态链接

静态链接是与静态库相对应的
当我们使用静态库的时候就进行静态链接。
我们可以用

gcc test.o -static -o test

这个方式来设置为静态链接
我们可以看看静态链接和动态链接文件大小

在这里插入图片描述

我们看到动态和静态大小差异巨大
这是因为:静态链接方式是将整个静态库写入至代码中

可以说这多出来的800000位的大小都是库的大小

两种方法对比

了解两种的链接方式后,会发现他们其实优缺点还是挺明显的

静态链接
优点:方便移植,不需要搭建库(毕竟整个库都在文件中)
缺点:浪费资源(读写资源,磁盘空间等)
静态链接
优点:节省资源
缺点:使用时需要下载动态库

但是实际上使用的时候,可以在一个项目中按照需求进行选择
做到静态和动态链接搭配使用

http://www.lryc.cn/news/194310.html

相关文章:

  • [Python]黑色背景白色块滑动视频
  • 【linux kernel】对linux内核设备的注册机制和查找机制分析
  • asp.net酒店餐饮管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 38_Nginx 启动流程
  • 数据特征选择 | Lasso特征选择(Python)
  • 最小覆盖子串[困难]
  • 保姆级搭建Mysql 并进行视图可视化操作
  • 设计模式的学习顺序
  • 数据结构和算法——树结构
  • 【Java】Integer包装类
  • Web后端开发登录校验及JWT令牌,过滤器,拦截器详解
  • 大语言模型迎来重大突破!找到解释神经网络行为方法
  • zabbix内置宏、自动发现与注册
  • Oracle与Mysql语法区别
  • Jetpack:008-Icon与Image
  • 参数解析(牛客)
  • Linux网络编程系列之服务器编程——阻塞IO模型
  • 排序算法-基数排序法(RadixSort)
  • nginx绑定tomcat与tomcat联合使用的配置(nginx反向代理tomcat的配置说明)
  • 【Java】nextInt()后面紧接nextLine()读取不到数据/InputMismatchException异常的解决方案
  • 【传输层协议】UDP/TCP结构特点与原理(详解)
  • 哪种网站适合物理服务器
  • uni-app集成使用SQLite
  • Qt不能安装自己想要的版本,如Qt 5.15.2
  • 学信息系统项目管理师第4版系列28_组织级项目管理和量化项目管理
  • Bean实例化的三级缓存
  • Jenkins+Gitlab+Docker(Dockerfile)部署
  • Web前端-Vue2+Vue3基础入门到实战项目-Day4(组件的三大组成部分, 组件通信, 案例-组件版小黑记事本, 进阶语法)
  • 【大模型应用开发教程】01_大模型简介
  • Flume 简介及基本使用