业界动态
C语言丨静态库与动态库的区别,你知道多少?
2024-11-19 00:25

在编程的过程中,使用已经封装好的库函数是十分方便的,也是十分高效的,因此会使用函数库是很重要的。在C语言中,函数库文件分为两种类型,一种是静态库(库程序是直接注入目标程序的,不分彼此,库文件通常以.a结尾,另一种是动态库(库程序是在运行目标程序时(中)加载的,库文件通常以.so结尾,下面我们就探索一下这两种库文件的特点和使用方式吧

C语言丨静态库与动态库的区别,你知道多少?

前言

我们要先了解一下源文件到可执行文件的编译过程如下图

预编译

预编译是使用预编译器cpp进行处理.c源文件和.h头文件,最终生成一个.i的文件。预编译过程就是处理源代码中以#开头的预编译指令,如#include #define 等。预编译过程等价于如下命令

gcc -E hello.c -o hello.i 或则 cpp hello.c > hello.i

#include 就是将包含的头文件全部展开到#include的位置,所以一个.c源文件如果包含多个头文件,头文件的顺序是需要注意的地方。

编译

编译的过程就是将 预处理 完的文件进行一系列的词法分析、语法分析、语义分析及优化,最后生成 .s 汇编代码文件。编译过程等价如下命令

gcc -S hello.i -o hello.s

编译过程是整个程序构建的核心部分,也是最复杂的部分之一。

汇编

汇编器是将汇编代码转变成机器可以执行的指令, 每一条汇编代码几乎都对应着一条机器指令。最后生成一个 .o 目标文件。汇编过程等价如下命令

gcc -c hello.s -o hello.o 或者 as hello.s -o hello.o

汇编器的汇编过程相对简单一些,只需要根据汇编指令和机器指令对照表一一翻译就可以了。

链接

链接的作用就是我们这篇文章的重点,就是将我们编译出来的目标文件和我们代码所用到的库文件一起打包成一个可执行文件的过程。例如hello.c中的打印函数printf,这个函数不是凭空出现的,在链接的过程中就要连同对应库文件一起打包,最终可执行文件才能正常运行。

静态库VS动态库

静态库和动态库的载入时间是不一样的。

静态库的代码在编译的过程中已经载入到可执行文件中,所以最后生成的可执行文件相对较大。

动态库的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,所以最后生成的可执行文件相对较小。

静态库和动态库的最大区别是,静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

静态库

静态库的名字一般是libxxx.a 在编译的时候直接编译进可执行文件中,运行环境中可以不用存在库文件,但是如果库文件更新了,可执行文件需要重新编译。

操作静态库

Linux下使用ar命令进行操作静态库

ar archivefile objfile

archivefile:archivefile是静态库的名称

objfile: objfile是已.o为扩展名的中间目标文件名,可以多个并列

参数 意义

-r 将objfile文件插入静态库尾或者替换静态库中同名文件

-x 从静态库文件中抽取文件objfile

-t 打印静态库的成员文件列表

-d 从静态库中删除文件objfile

-s 重置静态库文件索引

-v 创建文件冗余信息

-c 创建静态库文件

编译静态库

在编译成静态库之前,我们需要将源文件编译一下,生成一个 .o 文件的目标文件。例如写了一个打印helloworld的接口,我们要先执行

gcc -c hello.c ar crv libhello.a hello.o

第一条命令是生成目标文件hello.o ,第二条命令是将目标文件hello.o 打包成静态库文件libhello.a。

链接静态库

上面我们说了静态库是如何生成的,然后我们说一下静态库怎么使用。静态库是要编译进可执行文件的,在程序运行的环境中,并不需要静态库的存在。比如我们生成的静态库文件是libhello.a 需要编译的文件是main.c。编译命令如下

gcc main.c -L . -lhello

解读一下: -L 后面是静态库文件所在的目录,我这里 . 就是指当前目录的意思。也就是库文件就和源文件在同一路径。真正编译的时候,这个路径还是要填绝对路径要好,这个需要注意一下。后面的-l加上库名,这个库名是去掉lib和后面的.a。静态库的链接就是这样的。

动态库

动态库中的代码是可执行文件在运行中加载执行的,也就是说 程序运行环境中要有动态库文件。一般动态库文件命名为lib***.so。动态库的优点就是方便升级,动态库变化了,可执行文件不用重新编译。

编译动态库

还拿hello.c来说,使用下面的命令就可以生成一个动态库文件libhello.so 。看一下各个参数的含义。

gcc -fPIC -shared -o libhello.so hello.c

-fPIC 是创建与地址无关的编译程序(pic,position independent code,是为了能够在多个应用程序间共享。-shared指定生成动态链接库。

调用动态库态库

我们在运行环境中直接运行可执行文件,前提动态库文件也在运行环境中。需要注意的是 系统在运行程序的时候,需要知道动态库的名称和位置,这样才能加载,如果找不到动态库就会直接程序退出报错。

所以在编译程序的时候使用下面方式编译

gcc mian.c -o mian -L https://blog.csdn.net/gongjdde/article/details/ -lhello

同样,-L后面是库文件的路径,最好是用绝对路径。-l加上去掉lib的库名。然后直接执行可执行文件就可以了。

还用一种使用动态库的方式是

    以上就是本篇文章【C语言丨静态库与动态库的区别,你知道多少?】的全部内容了,欢迎阅览 ! 文章地址:http://sicmodule.glev.cn/news/10089.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 歌乐夫资讯移动站 http://sicmodule.glev.cn/mobile/ , 查看更多   
最新新闻
京东改手机号(京东改手机号码)
  关于《京东改手机号》的指南  随着互联网的普及和电子商务的飞速发展,京东作为中国最大的电商平台之一,吸引了众多用户的
手机唤醒功能(手机唤醒功能在哪)
  文章标题:《手机唤醒功能:科技之光唤醒生活的便捷性》  随着科技的飞速发展,智能手机已经成为了我们日常生活中不可或缺
手机用什么p图软件(手机用什么p图软件不压缩)
  手机用什么P图软件?全面解析当下最热门的移动修图工具  随着智能手机的普及,人们对照片的美观度要求越来越高。因此,各
手机架怎么折(手机架怎么折视频教程)
  标题:《手把手教你折出实用的手机架》  在当今时代,手机已成为我们日常生活中不可或缺的伴侣。随着手机的普及,手机架也
手机内存空间不足怎么清理(手机内存空间不足,建议清理)
  关于《手机内存空间不足怎么清理》的文章  随着智能手机的普及,我们的手机中存储的信息越来越多,无论是工作文件、照片、
手机场景图(手机场景服务在哪里)
  关于《手机场景图》的文章  随着智能手机的普及,我们的生活越来越离不开手机。在日常生活中,我们会用手机拍摄各种场景,
手机没电了打电话提示什么(手机没电了打过去会提示什么)
  文章标题:《手机没电了打电话提示什么》  在这个科技日新月异的时代,手机已成为我们日常生活中不可或缺的一部分。然而,
手机没充满电拔了对手机有坏处吗(手机充电中途拔掉会影响手机吗)
  关于《手机没充满电拔了对手机有坏处吗》的探讨  随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的伙伴。与此
华为手机图案解锁(华为手机图案解锁设置不见了)
  华为手机图案解锁:一种直观且便捷的安全方式  随着科技的进步和智能手机的普及,手机安全成为人们日益关心的问题。在众多
天马手机屏幕(天马手机屏幕寿命)
  天马手机屏幕:技术与艺术的完美结合  在当今智能手机市场,天马手机屏幕以其卓越的品质和技术创新赢得了广大消费者的青睐