目录
什么是库
库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。
本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:
• 静态库 .a
[Linux]、.lib
[windows]
• 动态库 .so
[Linux]、.dll
[windows]
静态库
- 静态库(.a):程序在编译链接的时候把库的代码链接到可执⾏⽂件中,程序运⾏的时候将不再需要静态库。
- ⼀个可执⾏程序可能⽤到许多的库,这些库运⾏有的是静态库,有的是动态库,⽽我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采⽤同名静态库。我们也可以使⽤ gcc的 -static 强转设置链接静态库。
静态库生成
将所有的.o
二进制文件打包成库。动静态库本质都是.c
文件对应的.o
二进制文件
ar -rc libname.a *.o
ar
是 gnu
归档⼯具, rc
表示(replace and create)
,如果有新增加的.o
文件,或者有.o
文件想修改,可以只用ar -rc libname.a *.o
,会增加或修改对应的.o
文件。
注意:libmyc.a
就是静态库,去掉前缀lib
和后缀.a
,myc
才是库名。
静态库使用
头文件和库文件安装到系统路径下
头文件和库文件和我们自己的源文件在同一个路径下
头文件和库文件有自己的独立路径
注意:
-L
: 指定库路径
-I
: 指定头⽂件搜索路径
-l
: 指定库名
测试目标文件生成后,静态库删掉,程序照样可以运行
动态库
- 动态库(.so):程序在运⾏的时候才去链接动态库的代码,多个程序共享使⽤库的代码。
- ⼀个与动态库链接的可执⾏⽂件仅仅包含它⽤到的函数⼊⼝地址的⼀个表,⽽不是外部函数所在⽬标⽂件的整个机器码。
- 在可执⾏⽂件开始运⾏以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)。
- 动态库可以在多个程序间共享,所以动态链接使得可执⾏⽂件更⼩,节省了磁盘空间。操作系统采⽤虚拟内存机制允许物理内存中的⼀份动态库被要⽤到该库的所有进程共⽤,节省了内存和磁盘空间。
动态库生成
• shared
: 表⽰⽣成共享库格式
• fPIC
:产⽣位置⽆关码(position independent code)
• 库名规则:libxxx.so
动态库使用
头文件和库文件安装到系统路径下
头文件和库文件和我们自己的源文件在同一个路径下
头文件和库文件有自己的独立路径
问题
ldd name //查看可执行程序的所依赖的动态库
解决方案
• 拷⻉ .so ⽂件到系统共享库路径下, ⼀般指 /usr/lib、/usr/local/lib、/lib64 或者开篇指明的库路径等
• 向系统共享库路径下建立同名软连接
• 更改环境变量: LD_LIBRARY_PATH
,它是 Linux
系统中用于动态链接库(.so
文件)搜索路径的关键变量。
- 动态库搜索路径:当程序运行时,系统会通过 LD_LIBRARY_PATH 指定的路径查找动态链接库(.so 文件)。
- 优先级:LD_LIBRARY_PATH 的优先级高于系统默认的库路径(如 /usr/lib、/lib 等),因此常用于临时覆盖或扩展库的搜索路径。
• ldconfig
⽅案:配置/ etc/ld.so.conf.d/
,ldconfig
更新缓存