### Linux动态库详解 #### 一、概述 Linux 动态库是操作系统中不可或缺的一部分,它们使得多个程序能够共享相同的代码段,进而减小程序体积、提高资源利用率。本文将详细介绍 Linux 动态库的基本概念、如何管理和配置动态库以及如何创建和使用动态库。 #### 二、动态库与静态库的区别 在 Linux 系统中,函数库主要分为两类:静态库和动态库。这两种库的主要区别在于编译和链接的方式不同。 - **静态库**: - 文件名通常以 `libxxx.a` 结尾。 - 编译后的程序体积较大,因为静态库中的所有数据都会被整合进目标代码中。 - 优点是程序运行时不依赖外部函数库,所有使用的函数都已经包含在内。 - 缺点是一旦静态库发生变化,程序必须重新编译才能使用更新后的库。 - **动态库**: - 文件名通常以 `libxxx.so` 结尾。 - 相对于静态库,动态库在编译过程中不会被直接整合进目标代码,而是在程序运行时按需调用。 - 可执行文件体积较小,因为程序执行时才会动态地申请并调用所需函数。 - 动态库的改变不会影响已编译的程序,这意味着动态库的升级较为方便。 #### 三、动态库的管理与配置 在 Linux 系统中,动态库的管理和配置主要涉及以下几个方面: - **LD_LIBRARY_PATH**:这是一个环境变量,用于列出除默认路径外的其他共享库路径。如果希望使用特定路径下的动态库,但又不具备修改 `/etc/ld.so.conf` 的权限(例如无 root 权限),可以通过设置 `LD_LIBRARY_PATH` 来实现。例如,可以通过命令 `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib` 来添加 `/opt/lib` 路径。 - **/etc/ld.so.conf**:这是链接器和加载器搜索共享库时要检查的目录列表文件。可以通过编辑此文件来添加自定义的动态库目录。添加完新目录后,需要执行 `/sbin/ldconfig` 命令使更改生效。 - **/sbin/ldconfig**:这是一个用于重建动态链接器的缓存文件 `/etc/ld.so.cache` 的工具。该文件保存了常用的动态函数库信息,为了提高软件加载动态函数库的速度,系统会优先将这些库加载到内存中,因为内存访问速度远高于硬盘。 #### 四、示例:创建和使用动态库 接下来,我们将通过一个具体的例子来展示如何创建和使用动态库。 假设我们有以下三个文件: - `str_out.h`:头文件,定义了一个输出字符串的函数。 - `str_out.c`:源文件,实现了 `str_out` 函数。 - `main.c`:主程序文件,调用 `str_out` 函数。 1. **创建动态库**: 首先需要编译 `str_out.c` 为 `.o` 文件: ```bash gcc -c str_out.c ``` 然后使用 `-shared` 和 `-fPIC` 选项来创建动态库: ```bash gcc -shared -fPIC -o libstr_out.so str_out.o ``` 2. **使用动态库**: 在 `main.c` 中,我们需要链接动态库。首先编译 `main.c`: ```bash gcc -c main.c ``` 然后链接动态库并生成可执行文件: ```bash gcc -o out main.o -L. -lstr_out ``` 其中 `-L.` 表示搜索当前目录下的库文件,`-lstr_out` 指定要链接的动态库名称。 3. **配置动态库路径**: 如果 `libstr_out.so` 不在默认路径中,还需要配置 `LD_LIBRARY_PATH` 或修改 `/etc/ld.so.conf` 并执行 `/sbin/ldconfig`。 通过以上步骤,我们可以成功地创建和使用一个简单的动态库。这种做法不仅适用于开发阶段,也广泛应用于实际部署环境中,有助于提高程序性能和资源利用效率。























直接最简单的方法就是把libstr_out.so拉到/usr/lib 或/lib中去。
环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路径。
如果不想修改或无法修改(无root权限)/etc/ld.so.conf而使用其他路径下的库文件就需要设置LD_LIBRARY_PATH了。
例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib这样就可以使用/opt/lib下的库文件啦。
还有一种方法 export LD_LIBRARY_PATH=$(pwd)
另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,
默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行
/sbin/ldconfig
另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库,且会先把他们加载到内存中,
因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。
========
Linux中有两类函数库,分别是静态库和动态库。
静态函数库:
这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
动态函数库:
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
下面来介绍linux静态函数库的创建和使用:
例程str_out.h str_out.c main.c:
str_out.h
#ifndef STR_OUT_H


- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于形状直径函数的三维模型集一致性分割算法研究.docx
- 有关数字通信系统中技术应用分析.docx
- 大数据平台产品体系介绍.pdf
- 从数据挖掘到重点知识产生.ppt
- 学院学生宿舍楼综合布线方案.doc
- 浅议高校档案信息化建设与公共服务能力.docx
- 电子商务师三测验考试理论真题(三).doc
- 管理信息系统开发的项目管理.docx
- 项目管理中的关键流程.docx
- 最新共享互利共赢-互联网平台运营模式生存启示录模板ppt模板:.pptx
- 天津科技政务网络安全管理的研究.doc
- MATLAB程式设计方案与应用.doc
- 班单片机课程设计任务书.doc
- JSPWEB图书馆借阅系统设计方案与实现S.doc
- 互联网巨头纷纷布局加快生鲜电商行业发展.docx
- 大数据环境下的《证券投资学》课程教学探索.docx


