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 静态库和动态库编译的区别

linux动静态库

linux动静态库

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名