静态库
g++ -c test.cpp
ar -crv libtest.a test.o
动态库
g++ -fPIC -shared -o libtest.so test.cpp
编译流程
回顾程序编译的四个步骤:
预编译 -> 编译 -> 汇编 -> 链接
静态库和动态库就是在链接阶段行为不同,静态库会在链接阶段将汇编生成的目标文件 .o 与引用的库一起链接打包到可执行文件中。静态库其实就是一系列目标文件的集合,可以用 ar 工具打包生成。
静态库的概念
静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,对应的链接方式称为静态链接。试想一下,静态库与汇编生成的目标文件(.o文件)一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的归档集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结:
1、静态库对函数库的链接是放在编译时期完成的。
2、程序在运行时与函数库再无瓜葛,移植方便。
3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态库的概念
动态库特点总结:
- 动态库把对一些库函数的链接载入推迟到程序运行的时期。
- 可以实现进程之间的资源共享。(因此动态库也称为共享库)
- 将一些程序升级变得简单。
- 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。
解决动态库找不到的问题:
第一种: 将动态库的绝对路径添加到 LD_LIBRARY_PATH 中
测试时候使用的, 终端关闭, 设置失效:
在当前终端中执行: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/库的路径
长久设置, 将export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/库的路径
写到配置文件中
用户: ~/.bashrc
添加: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/库的路径
系统: /etc/profile
添加: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/库的路径
添加完成执行命令, 使修改生效:
. ~/.bashrc
. /etc/profile
source /etc/profile
. 相当于 source
第二种: 在 /etc/ld.so.cache 添加动态库路径
打开文件: /etc/ld.so.conf
将.so文件路径的目录添加到/etc/ld.so.conf, 更新: sudo ldconfig
/etc/ld.so.conf的作用:记录了程序加载运行期间查找动态链接库时的路径。