静态动态库
把源代码转换成机器读懂的二进制。
1.静态库
形式:libxxx.a
1.1 制作静态库
先把源文件(.c,.cpp)进行汇编(-c)得到.o二进制文件,再用ar打包。把打包完的和头文件一起发送给客户
1.2 静态库使用
当我们得到了一个可用的静态库之后,需要将其放到一个目录中,然后根据得到的头文件编写测试代码,对静态库中的函数进行调用。
# 1. 首先拿到了发布的静态库 `head.h` 和 `libcalc.a` # 2. 将静态库, 头文件, 测试程序放到一个目录中准备进行测试 . ├── head.h # 函数声明 ├── libcalc.a # 函数定义(二进制格式) └── main.c # 函数测试 # 4. 编译的时候指定库信息 -l: 指定库所在的目录(相对或者绝对路径) -l: 指定库的名字, 掐头(lib)去尾(.a) ==> calc # -l -l, 参数和参数值之间可以有空格, 也可以没有 -l./ -lcalc $ gcc main.c -o app -l ./ -l calc # 查看目录信息, 发现可执行程序已经生成了 $ tree . ├── app # 生成的可执行程序 ├── head.h ├── libcalc.a └── main.c
2.动态库
- linux:libxxx.so
- windows:libxxx.dll
2.1 生成动态库

2.2 动态库使用
# 在编译的时候指定动态库相关的信息: 库的路径 -l, 库的名字 -l $ gcc main.c -o app -l./ -lcalc # 查看是否生成了可执行程序 $ tree . ├── app # 生成的可执行程序 ├── head.h ├── libcalc.so └── main.c # 执行生成的可执行程序, 错误提示 ==> 可执行程序执行的时候找不到动态库 $ ./app ./app: error while loading shared libraries: libcalc.so: cannot open shared object file: no such file or directory
报错信息:找不到动态库
动态库里面代码:只有执行程序用到动态库里面函数,动态库才会加载到内存。
2.3 解决动态库无法加载问题
- 静态库:编译链接时把代码复制进可执行文件;
- 动态库:编译链接只做 “登记”,代码在程序运行时才加载进内存。
动态库:可执行程序被执行起来之后:
程序执行的时候会先检测需要的动态库是否可以被加载,加载不到就会提示上边的错误信息
当动态库中的函数在程序中被调用了, 这个时候动态库才加载到内存,如果不被调用就不加载
动态库的检测和内存加载操作都是由动态连接器来完成的
当用户的程序需要加载动态库的时候动态连接器就开始工作了,很显然动态连接器根本就不知道用户通过 gcc 编译程序的时候通过参数 -l指定的路径。

解决方法(最容易)
# 创建软连接 sudo ln -s /xxx/xxx/libxxx.so /usr/lib/libxxx.so
第一个路径:.so的绝对路径
第二个:最好用/usr/lib/libxxx.so
验证
# 语法:
$ ldd 可执行程序名
# 举例:
$ ldd app
linux-vdso.so.1 => (0x00007ffe8fbd6000)
libcalc.so => /home/robin/linux/3day/calc/test/libcalc.so (0x00007f5d85dd4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5d85a0a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5d85fd6000) ==> 动态链接器, 操作系统提供总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论