Linux 静态库/动态库的制作与使用(通俗易懂)

简介: Linux 静态库/动态库的制作与使用(通俗易懂)

一、什么是库


1、库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类;


2、库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行;


3、库文件有两种,静态库和动态库(共享库),区别是︰静态库在程序的链接阶段被复制到不程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用;


4、库的好处: (1)代码保密;(2)方便部署和分发;


二、工作原理


1、静态库:gcc 进行链接时,会把静态库中代码打包到可执行程序中;


2、动态库: gcc进行链接时,动态库的代码不会被打包到可执行程序中;


3、程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamicdependencies)命令检查动态库依赖关系;


4、如何定位共享库文件呢?

当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段—>环境变量LD_LIBRARY_PATH —>/etc/ld.so.cache文件列表—>/lib/,/usr/lib目录找到库文件后将其载入内存。(即把动态库的绝对路径添加到环境变量等等任意一个中)


三、静态库的制作与使用


1、静态库的制作


gcc 获得.o 文件,将.o 文件打包,使用ar工具(arghive)

ar rcs 1ibxxx.a xxx.o xxx.o    

说明:
(1)r-将文件插入备存文件中
(2)c-建立备存文件
(3)s-索引
(4)1ibxxx.a中xxx是静态库的名称


2、静态库的使用


gcc main.c -o app -I ./include/ -L ./lib/ -l xxx

说明:
(1)-I ./include/ 到指定文件夹搜索相应头文件
(2)-L ./lib/ 到指定文件夹搜索相应静态库
(3)-l xxx 指定要搜索的静态库名称


四、动态库的制作与使用


1、动态库的制作


//gcc得到.o文件.得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c
//gcc得到动态库
gcc -shared a.o b.o -o libxxx.so    //xxx指动态库名称


2、动态库的使用


gcc main.c -o app -I ./include/ -L ./lib/ -l xxx
//如果只使用该命令则会报错,因为动态库不会被打包到可执行程序中,必须使用
//动态载入器将动态库中的代码加载到内存中即可
//方式1:配置临时变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Linux/lesson6/library/lib
//说明:
//(1)/home/Linux/lesson6/library/lib为动态库的绝对路径
//(2)该方式配置的环境变量为临时的
//方式2:配置永久环境变量(用户级别)
vim .bashrc                            //打开该文件
//把该语句添加到bashrc中,保存并退出
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Linux/lesson6/library/lib      
. .bashrc                              //使环境变量生效,其等价于 source .bashrc  
//方式3:配置永久环境变量(系统级别)
sudo vim /etc/ld.so.conf               //修改该文件
/home/Linux/lesson6/library/lib        //把该路径复制进去保存并退出
sudo ldconfig                          //更新


五、静态库与动态库的对比


1、静态库的优缺点


(1)优点:静态库被打包到应用程序中加载速度快;发布程序无需提供静态库,移植方便;

(2)缺点:消耗系统资源,浪费内存;更新、部署、发布麻烦(即如果修改了静态库函数,需要重新进行编译);

8c13edfbd1d64d2db72a0b597377d1d8.png


2、动态库优缺点


(1)优点:可以实现进程间资源共享(共享库);更新、部署、发布简单;可以控制何时加载动态库(即只在使用时才会去加载);

(2)缺点:加载速度比静态库慢;发布程序时需要提供依赖的动态库;

09dac6900ec7440ca898ee8a95ab1961.png

相关文章
|
4月前
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
97 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
4月前
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
5月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
160 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4月前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
4月前
|
小程序 Linux 开发者
Linux之缓冲区与C库IO函数简单模拟
通过上述编程实例,可以对Linux系统中缓冲区和C库IO函数如何提高文件读写效率有了一个基本的了解。开发者需要根据应用程序的具体需求来选择合适的IO策略。
34 0
|
5月前
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
60 0
|
5月前
|
Linux Shell vr&ar
【linux】详解——库
【linux】详解——库
|
7月前
|
Linux 编译器 Shell
深入理解Linux中的动态库与静态库
深入理解Linux中的动态库与静态库
|
7月前
|
存储 Linux 编译器
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
42 0