Linux动态库(.so)静态库(.a)的制作和使用
Posted 清水寺扫地僧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux动态库(.so)静态库(.a)的制作和使用相关的知识,希望对你有一定的参考价值。
对于开发过程,常将一组具有近似、相似功能的函数集合封装为一个库,以便提高开发效率,提高代码复用率,特别是对于需要长期迭代的开发项目而言。而库又可分为静态库(.a)和动态库(.so)。
关于动态库和静态库的内容见:链接器、链接过程及相关概念解析 中 2.3 共享目标文件(.dll和.so) 和 3.1 符号解析(symbol resolution)——符号解析:③链接器怎样使用静态库解析引用(解析顺序与结果) 的相关内容。
1. 静态库制作及使用步骤
每个静态库的程序都要将整个静态库编译到可执行文件中,即每个程序都有一个代码副本。优点是将库函数本地化之后,调用速度很快,缺点是对系统资源(主要是内存)消耗大。适用于对时间要求高的核心程序,如内核的库函数的实现。
- ①将 .c 文件生成 .o 文件:
gcc -c add.c -o add.o
; - ②使用 ar 工具制作静态库:
ar rcs lib库名.a add.o sub.o div.o
; - ③编译静态库到可执行文件中:
gcc test.c lib库名.a -o a.out
;(参数顺序先源文件再库文件) - ④运行可执行目标文件
./a.out
;
头文件守卫:防止头文件被重复包含
#ifdef _HEAD_H_
#define _HEAD_H_
......
#endif
头文件宏定义相关知识可见:防止头文件重复包含:#ifndef 和 #prama once 比较
2. 动态库制作及使用步骤
动态库是多个可执行程序共享一份库文件(共享代码而不共享数据),其优点是节省内存,易于更新;缺点是由于实现机制,较静态库调用速度慢。适用于对速度要求不高,系统资源紧俏的场合。
- ①将 .c 文件生成 .o 文件,生成与位置无关的代码(PIC):
gcc -c add.c -o add.o -fPIC
; - ②使用 gcc -shared -o 制作动态库:
gcc -shared -o lib库名.so add.o sub.o div.o
; - ③编译可执行程序时,指定所使用的动态库。
−
l
-l
−l 指定库名,
−
L
-L
−L 指定库路径:
gcc test.c -o a.out -lmymath -L./lib
; - ④运行可执行目标文件
./a.out
;
其中对于④,若是直接执行会出错error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory
,解决该问题前首先辨别两个概念:
链接器(ld):工作于链接阶段,工作时需要
−
l
-l
−l 和
−
L
-L
−L;
动态链接器:工作于程序运行阶段,工作室需要提供动态库所在目录位置;
出错的原因在于,加载器运行时,发现有用到动态库,则调用位置记录在 i n t e r p interp interp节的动态链接器加载动态库,而动态链接器的环境变量中并不包含动态库文件,所以出错。
解决方法有四种如下:
(1) export LD_LIBRARY_PATH=动态库路径
(export表示加载生效),但这种方式只是临时生效,若是终端重启后就得再次设置;
(2) 将路径写入终端配置文件~/.bashrc
当中,该方法一劳永逸,且最好写的是绝对路径(vi编辑~/.bashrc
,写入以上指令并保存,然后在shell中source ~/.bashrc
,重启终端即可);
(3) 将
.
s
o
.so
.so 库放置在 /lib
文件夹下;
(4) 修改 sudo vi /etc/ld.so.conf
,在其中添加共享库绝对路径并保存(直接粘贴路径即可),再更新查找共享库的路径(使配置文件生效),在shell中使用sudo ldconfig (-v)
指令,再在shell中测试动态链接器可否找到共享库文件,使用ldd a.out
(不是notfound
提示即配置正确)进行测试;
以上是关于Linux动态库(.so)静态库(.a)的制作和使用的主要内容,如果未能解决你的问题,请参考以下文章
linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名