1 库是什么
假如你写了一个perfect的项目, 有公司想要购买的你的源代码, 此时你肯定不想把你的源代码就这么给别人, 你只想让别人使用就够了.
那么你可以把的源代码生成为.o二进制文件, 封装成库, 这样别人既可以使用, 你的源代码也不会泄露. 而且c的二进制文件很难反编译, java则比较容易…
- 二进制文件
- 将源代码 ->> 二进制格式的源代码
- 加密
库的使用需要头文件与库文件
2 静态库.a
的制作和使用
2.1 命名规则 :
由三部分组成 : libxxx.a
xxx 为库的名字
2.2 制作步骤
- 源代码( c, cpp)
- 生成二进制文件(.o)
gcc hello.c -c
- 将.o打包, 用到工具ar, archive(归档),
ar rcs 静态库的名字 原文件
, 例 :ar rcs libtest.a hello.o
nm libtest.a
查看静态库里的内容
2.3 库的使用
gcc main.c -I ./ -L./lib -lmycalc-o app
-L
: 指定库的路径-l
: 指定库的名字(掐头去尾)-I
: 指定头文件的路径-o
: 指引生成文件的名字
3 动态库.so
的制作和使用
3.1 命名规则
libxxx.so
: xxx库的名称
3.2 制作步骤
将源文件生成二进制文件.o
gcc a.c b.c -c -fpic(fPIC)
打包
gcc -shared a.o b.o -o libxxx.so
3.3 库的使用
需头文件a.h
需动态库 libtest.so
gcc main.c -I ./include -L ./lib -l test -o app
-I
: 指定头文件的路径-L
: 指定库的路径-l
: 指定库的名字(掐头去尾)-o
: 指引生成文件的名字ldd app
查看可执行程序运行时需要哪些库
3.4 动态库加载
1 使用环境变量 env中PATH
- 临时设置 :
- 在终端中
export LD_LIBRARY_PATH=动态库路径:$LD_LIBRARY_PATH
- $是取值符, 冒号拼接, 以免覆盖里面本来就有的值
- 在终端中
永久设置 :
用户级别
- 写入语句 ~/.bashrc
- 然后重启中终端 或 source ~/.bashrc
系统级别
- /etc/profile
- 重启系统 或 source /etc/profile
2 更新/etc/la.socache文件列表
适用于长期不变
- 找到配置文件/etc/ld.so.conf
- 把动态库的绝对路径写入
- 执行命令
sudo ldconfig [-v](显示信息)
3 调用函数
dlopen, dlclose, dlsym
4 静态库, 动态库优缺点
4.1 静态库
1 优点
- 静态库被打包到应用程序中加载速度快
- 发布程序无需提供静态库, 移植方便
2 缺点
- 浪费系统资源, 浪费内存, 不同应用程序存在大量重复的库, 一位各自绑定在一起, 严重浪费内存
- 更新, 部署 , 发布麻烦, 更新的话需要用户重新安装程序
4.2 动态库的优缺点
app制作好了之后, 动态库没有打包到app里, 动态库不会在开始被加载, 只当程序调用动态库中的函数时才会被加载. 程序运行之前会先判断库是否存在. 通过动态链接器ld-linux-x86-64.so
1 优点
- 可实现进程间的资源共享
- 程序升级简单
- 可控制何时加载动态库
2 缺点
- 加载速度比静态库慢
- 发布程序需要提供相应动态库