版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
介绍在Linux下使用静态库、共享库、动态库的方法。
Linux库文件
- 静态库
- 在Linux中,以.a为后缀,如
libtest.a
- 直接拷贝函数到二进制映像文件
- 只需要运行二进制文件,可以直接运行
- 在Linux中,以.a为后缀,如
- 共享库
- 在Linux操作系统中,以
libxxx.so.x.x
为格式命名 - 可执行文件在开始运行时将函数从共享库文件中读出,从而间接引用
- 好处是,当函数接口没变,实现改变时,不需要再次编译
- 在Linux操作系统中,以
- 动态库
- 动态加载库在指定位置加载的函数库
- 可以减少内存开销
库函数基本路径
/lib
- 标准共享库和静态库
/usr/lib
- 标准共享库和静态库
/usr/local/lib
- 本地函数库
库文件搜索顺序
- 首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找(一般都没有给此环境变量赋值)
- 搜索动态装载器在/etc目录下的缓存文件/etc/ld.so.cache(此文件由命令ldconfig创建更新)。
ldd
命令–查看到某可执行程序共享库清单
创建静态库
-
libhello.c
为要构建的库文件源文件,libhello.h
为调用此库文件的头文件,usehello.c
为测试程序。 -
首先将所需要文件编译成目标文件
-
gcc -c libhello.c
- 1
-
-
使用
ar
命令创建静态库-
ar rc libhello.a libhello.o
- 1
-
-
编译运行
-
gcc -o usehello_static usehello.c libhello.a
- 1
-
创建共享库
-
首先将所需要的库编译成目标代码,这里生成与位置无关,可以在任何地址被链接和装载:
-
gcc -fPIC -Wall -g -c libhello.c
- 1
-
-
使用
-shared
来创建共享库-
gcc -g -shared -Wl,-soname,libhello.so.1.0 -o libhello.so.1.0 libhello.o
- 1
-
这里的
so.1.0
表示对应的完整版本号,具体可参考这里。
-
-
创建
soname
连接:-
ln -sf libhelloso.1.0 libhello.so
- 1
-
这里创建一个链接,只是为了方便以后版本更新时,只需要更改链接的路径,不改变编译代码
-
-
编译并连接引用库文件
-
gcc -Wall -g -c usehello -o usehello.o gcc -g -o usehello_dynamic usehello.o -L ./ -lhello //连接引用库文件
- 1
- 2
-
其中,
-L
表示搜索路径,./
表示搜索当前路径 -
-lhello
- 会自动在
-l
前变为lib
,加上.so
,变为libhello.so
- 会自动在
-
-
运行,需要添加当前目录
pwd
到环境变量中-
LD_LIBRARY_PATH=$(pwd) ./usehello_dynamic
- 1
-
-
如果希望在使用连接器时不使用
-Ldirectory
标识就可以查找到该库,则可以采用以下方式之一:- 把此库拷贝到/usr/lib或者/lib文件夹中,或者在此两个文件夹任意一个中创建一个到该库的快捷方式,并命名为libname.so。
- 如果库所在路径没有在/usr/lib和/lib文件夹下,需要将该路径添加到文件“/etc/ld.so.conf”中,每一行增加一个路径,完成以上设置后,然后运行ldconfig命令更新库信息。
动态库
-
在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是运行时加载。
-
有专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
- dlopen
- dlerror
- dlsym
- dlclose
-
使用示例
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-095d4a0b23.css" rel="stylesheet">
</div>
</article>