1、静态链接
静态链接:由链接器在链接时将库的内容加入到可执行程序中。
2、动态链接
动态链接:动态链接:连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序。
静态链接、动态链接编译:
gcc test.c -o test
gcc -static test.c -o test_static
一、静态库的制作及使用
静态库可以认为是一些目标代码的集合,是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分。
按照习惯,一般以“ .a ”做为文件后缀名。静态库的命名一般分为三个部分:
- 前缀:lib
- 库名称:自定义
- 后缀:.a
最终的静态库的名字:lib+库名称+ .a
1、静态库的制作
第一步:将所有的 .c 源文件 生成对应的 .o 文件
第二步:使用打包工具 a r将准备好的 .o 文件打包为 .a 文件
在使用ar工具时候需要添加参数:-rcs
- r更新
- c创建
- s建立索引
2、静态库的使用
测试文件test.c:
静态库制作完成后进行测试使用:
参数说明:
- -L./:表示要连接的库所在目录
- -I./: I(大写i) 表示指定头文件的目录为当前目录
- -l(小写L):指定链接时需要的库,去掉前缀和后缀
二、动态库的制作及使用
共享库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。
动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
按照习惯,一般以“.so”做为文件后缀名。共享库的命名一般分为三个部分:
- 前缀:lib
- 库名称:自定义
- 后缀:.so
所以最终的动态库的名字应该为:lib+库名称+.so
1、动态库制作
第一步:生成目标文件,加编译选项:-fpic
参数:-fpic 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。
第二步:生成共享库,加链接器选项: -shared(指定生成动态链接库)
第三步:通过 nm 命令查看对应的函数
说明制作成功
2、动态库的使用
引用动态库编译成可执行文件
执行完毕后运行可执行文件,系统会因为找不到对应库文件报错
动态库加载失败问题解决方法:
1、将自己制作的共享库拷贝到 /lib 或者 /usr/lib
2、临时设置 LD_LIBRARY_PATH:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 库路径
3、永久设置
把 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: 库路径,设置到~/.bashrc或者 /etc/profile文件中:
最后一行添加如下内容:
使环境变量生效
3、将其添加到 /etc/ld.so.conf 文件中
编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
运行sudo ldconfig -v,该命令会重建/etc/ld.so.cache文件
文件最后添加动态库路径(绝对路径):
使生效:
4、使用符号链接, 但是一定要使用绝对路径