命名(习惯 ):
静态库: .lib/.a 动态库.dll/.so
静态库的命名一般分为三个部分:
前缀:lib
库名称:自定义即可, 如test
后缀:.a
共享库的命名一般分为三个部分:
前缀:lib
库名称:自己定义即可, 如test
后缀:.so
库制作完成后, 如何给用户使用
头文件—包含了库函数的声明
库文件—包含了库函数的代码实现
静态库的制作:
静态库的使用:
动态库的制作:
动态库的使用:
动态库文件在编译的时候, 连接器需要使用参数-L找到库文件所在的路径;
在执行的时候, 是加载器ldd根据动态库的路径进行加载的, 与编译的时候用的-L指定的路径无关.
最常用的解决办法:将LD_LIBRARY_PATH环境变量加到用户级别的配置文件~/.bashrc中,
然后生效(. ~/.bashrc source ~/.bashrc 退出终端然后再登录)
head.h
fun1.c
fun2.c
main.c
动态库执行时候报错解决
分析为什么在执行的时候找不到libtest2.so库
当系统加载可执行代码时候, 能够知道其所依赖的库的名字, 但是还需要知道所依赖的库的绝对路径。此时就需要系统动态载入器(dynamic linker/loader)。
ldd命令可以查看可执行文件依赖的库文件, 执行ldd main2, 可以发现libtest2.so找不到.
对于elf格式的可执行程序,是由ld-linux.so*来完成的, 它先后搜索elf文件的 DT_RPATH段 — 环境变量LD_LIBRARY_PATH — /etc/ld.so.cache文件列表 — /lib/, /usr/lib目录找到库文件后将其载入内存。
使用file命令可以查看文件的类型: file main2
如何让系统找到共享库
- 拷贝自己制作的共享库到/lib或者/usr/lib
- 临时设置LD_LIBRARY_PATH:
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
- 永久设置, 把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径, 设置到∼/.bashrc文件或者/etc/profile文件中
- 将其添加到 /etc/ld.so.cache文件中
编辑/etc/ld.so.conf文件, 加入库文件所在目录的路径
运行sudo ldconfig -v, 该命令会重建/etc/ld.so.cache文件
解决了库的路径问题之后, 再次ldd命令可以查看可执行文件依赖的库文件, ldd main2: