该博文包含 解决程序执行时动态库无法被加载的问题
静态库
命名规则
lib + 库名字 + .a
eg:libdemo.a
制作静态库步骤
由 .c / .cc / .cpp 生成对应的 .o 文件
gcc demo.c -c demo.o / gcc -c *.c [-I 头文件路径]
将生成的 .o 文件打包
ar rcs 静态库的名字(libdemo.a) 生成的所有.o 文件
发布和使用静态库
- 发布静态库
- 头文件
- 使用静态库
gcc 源文件 -o 生成目标文件 [-I 头文件路径] -L 静态库路径 -l 静态库名称(去掉lib头和.o后缀)
gcc 源文件 -o 生成目标文件 [-I 头文件路径] -L 静态库路径/静态库名称(去掉lib头和.o后缀)
静态库优缺点
-
优点:
发布程序的时候不需要提供对应的库
加载库的速度快 -
缺点:
库被打包到应用程序中,导致应用程序的体积很大
库发生改变(如升级),需要重新编译程序
动态库 (共享库)
命名规则
lib + 库名字 + .so
eg:libdemo.so
制作步骤
- 生成与位置无关的 .o 文件
gcc -fPIC -c *.c [-I 头文件路径]
- 将 .o 文件打包成共享库 (动态库)
gcc -shared -o libdemo.so *.o [-I 头文件路径]
发布和使用共享库
- 发布:将库交给客户
- 使用
gcc 源文件 动态库路径/名称 -o 生成目标文件 [-I 头文件路径]
gcc 源文件 -o 生成目标文件 [-I 头文件路径] -L 动态库路径/动态库名称(去掉lib头和.so后缀)
命令 lbb 生成目标文件
lbb 生成的目标文件
查看可执行文件依赖的库以及详细信息
动态库优缺点
-
优点
执行程序体积小
更新方便,不需要重新编译程序 (不是绝对的,函数接口不能变) -
缺点
发布程序的时候,需要将动态库提供给用户
动态库没有被打包到应用程序中,加载速度相对较慢
解决程序执行时动态库无法被加载的问题
- 将动态库路径放入库目录中,即 /lib 目录下,及其不推荐,容易覆盖系统库
- 临时测试
设置环境变量值:LD_LIBRARY_PATH=动态库的路径
将设置的值导入到系统环境变量中:export LD_LIBRARY_PATH
当终端关闭,设置就会失效 - 不常用的方法 (永久设置)
在家目录的 .bashrc 文件中添加:export LD_LIBRARY_PATH=动态库的路径
.bashrc 修改完成,需要重新启动终端 - 常用方法:三步解决
1> 需要找到动态链接器的配置文件:/etc/ld.so.conf
2> 动态库的 绝对路径 写到配置文件中
3> 更新:执行命令sudo ldconfig -v
如有错误,欢迎指正!