什么是库
库的本质是一种可执行的二进制文件
在windows和Linux下都存在着大量的库,库是什么呢?本质上来说,库时一种可执行代码的二进制形式,可以被操作系统载入内存执行。
为什么使用库
避免重复造轮子
库通常是别人或者自己写好的某些公用函数、算法公式、针对某一个特定功能所实现的一些代码,然后封装成库,可以直接调用使用。
所以库是别人写好的,现有的,成熟的,可以服用的代码,你可以使用但要必须得遵守许可协议。在我们现实开发过程中,不可能每一份代码都从头编写,当我们拥有库时,我们就可以直接将我们所需要的文件链接到我们的程序中。可以为我们节省大量的时间,提高开发效率。
静态库 libxxx.a & 动态库libxxx.so
例如有3个文件 time.c time.h 、 test.c调用了time.c中的函数了
gcc 生成静态库和动态库
##无论静态库还是动态库都是由.o文件生成的,所以将time.c编译成time.o
##
gcc -c time.c //生成time.o
ar cr libmytime.a time.o //生成libmytime.a
## 静态链接
gcc -o test test.c -static -lmytime -L. //注意L后面的点
##动态库
gcc -shared -fPCI -o libmytime.so time.so
mv libmytime.so /usr/lib 或者使用 LD_LIBRARY_PATH
gcc -o test test.c -lmytime -L.
CmakeLists.txt生成动态库和静态库
- 动态库 ADD_LIBRARY(lib-name
SHARED
${LIB_SRC}) - 静态库 ADD_LIBRARY(lib-name ${LIB_SRC}) ##默认就是static Library
着重强调一下动态库的使用
从上面可以看出,静态可执行程序不依赖任何外部库就可以运行。
动态可执行程序程序需要外部共享库来提供运行所需的许多函数。
那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader)
动态装入器负责装入动态链接的可执行程序运行所需的共享库。
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache
/etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
## 所以它包含了/etc/ld.so.conf.d/文件夹下的各个lib的config文件
- 查看可以“看到”的共享库
sudo ldconfig -p | grep libopencv*
- 更新动态库
cd /etc/ld.so.conf.d
sudo touch ****.conf //例如 opencv.conf
然后在配置文件中添加上相对应的安装的库文件路径(安装时候的CMAKE_INSTALL_PREFIX指定的路径)
//例如 /usr/local/lib
sudo liconfig
LD_LIBRARY_PATH
要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH
变量设置成您希望搜索的目录。多个路径之间用冒号
分隔
export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。