linux下-动态库 静态库
1.库是什么?
二进制文件
将源代码 -> 二进制格式的源代码
.c .cpp
能干什么?
加密,保护知识产权
2.库制作出来之后,如何给用户使用?
头文件
制作出的库
windows静态库 : xxx.lib
windows动态库 : xxx.dll
3.静态库的制作和使用
命名规则
前缀:
lib
库的名字
xxx
后缀
.a
例如: libtest.a
制作步骤
原材料: 源代码 .c .cpp
将 .c 文件生成 .o
gcc a.c b.c -c
将 .o打包
ar rcs 静态库的名字 原材料
ar rcs libtest.a a.o b.o
查看库的内容
nm libtest.a
库的使用
提供 include(头文件) libtest.a 给用户
gcc test.c -I ./include/ -L ./lib/ -l test -o app
//静态库的名字 test 掐头去尾, 去掉 lib 和 .a
//-L ./lib/ 静态库的路径
gcc main.c -I ./include -L ./lib/ -l test -o app
4.动态库的制作和使用
命名规则
前缀:
lib
库的名字
xxx
后缀
.so //.so.1.7 版本
libxxx.so
制作步骤
将源文件生成 .o
gcc a.c b.c -c -fpic(fPIC)
打包
gcc -shared a.o b.o -o libxxx.so
gcc -shared -o libxxx.so a.o b.o
库的使用
提供 include(头文件) libtest.so 给用户
头文件 a.h
参考函数声明编译测试程序 main.c
gcc main.c -I ./ -L ./ -l test -o app //-l test -ltest 有没有空格都行
对于elf格式的可执行程序,是由ld-linux-so* 来完成的,它先后搜索 elf 文件的DT_RPATH段 -- 环境变量 LD_LIBRARY_PATH -- /etc/ld.so.cache 文件列表 -- /lib/ -- /usr/lib目录找到库文件后将其载入内存
ldd 查看可执行程序所需要的链接文件
env 查看path环境变量
echo $PATH 输出path环境变量信息
解决动态库加载失败的问题
使用环境变量
临时设置:
export LD_LIBRARY_PATH=动态库的绝对路径
export LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH (防止覆盖原来的环境变量,这样做更加安全)
永久设置:
用户级别
~/.bashrc
LD_LIBRARY_PATH=动态库的绝对路径 写到文件里面
LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH (防止覆盖原来的环境变量,这样做更加安全)
配置完成
-- 重启终端
source ~/.bashrc
系统级别
etc/profile
LD_LIBRARY_PATH=动态库的绝对路径 写到文件里面
LD_LIBRARY_PATH=动态库的绝对路径:$LD_LIBRARY_PATH (防止覆盖原来的环境变量,这样做更加安全)
配置完成
-- 重启终端
source /etc/profile
文件列表 /etc/ld.so.cache
找到一个配置文件
sudo vi /etc/ld.so.conf
把动态库绝对路径添加到文件中
例:
/home/mrchen/share/linux_basis/day02/3_dynamicLib
执行一个命令
sudo ldconfig [-v]
知识点拓展: 回调函数
dlopen dlclost dlsym
静态库 动态库优缺点
静态库:
优点:
静态库被打包到应用程序中加载速度快
发布程序无需提供静态库,移植方便
缺点:
浪费系统资源,浪费内存
更新,部署,发布麻烦
动态库:
gcc test.c -L ./ -l test -o app
./app
app制作好之后,动态库没有打包在app中
./app 动态库不会被加载,当程序调用动态库中的函数的时候,动态库才会被加载。
程序运行之前会先判断库是否存在
动态链接器 ls.so-x86.64
优点:
可实现进程间资源共享
程序升级简单
程序员可以控制何时加载动态库
缺点:
加载速度比静态库慢
发布程序需要提供依赖的动态库
linux下制作库
原文:https://www.cnblogs.com/period/p/12174855.html