静态库和动态库的创建
一.概述
什么是库? 说到底库就是一种可执行代码的二进制文件,但是它本身不能执行。
静态库在程序编译的时候会被连接到目标文件中,程序运行时不再需要该静态库。
动态库在程序编译时并不会连接到目标文件中,而是在程序运行时才会装入,因此程序运行时还是需要动态库存在。
二.静态库和动态库的区别
1. 优点
1) 静态库
程序独立性较强,只要编译好之后,就不在需要库文件。
2) 动态库
空间占用小, 方便升级,程序升级可以只升级库文件,而程序框架保持不变; 可以通过动态库实现进程之间的数据共享; 可在代码中实现动态库加载的控制; 不同程序调用相同的库,在内存中只需要一份该库的实例。
当然这两个库都有一个共同优点,就是保护了软件的安全性,隐藏了源代码。
2. 缺点
1) 静态库
空间占用较大, 升级需要整个程序重新编译连接。
2) 动态库
对动态库的依赖较强,无论是在编译还是运行时,都可能由于环境配置不正确导致失败。
三.如何生成静态库和动态库
1. 如何生成静态库
ar crs libxxxx.a (xxxx是库的名字,其余是固定格式) xxx.o
2. 如何生成动态库
gcc -fPIC -Wall xxxx.c -shared -o libxxxx.so
四.如何使用库
1. 编译时如何使用静态库
gcc main.c -L. –lxxxx
-L 指定你要连接的库的目录在哪里, -l 指定你要连接的库的名字
当然你也可以将你生成的库放在系统默认库目录下,如/usr/lib
2. 编译时如何使用动态库
1) 将你生成的库放入系统库目录下
2) 编译时这样使用 gcc main.c libxxxx.so
3) gcc main.c -L. -lxxxx
3. 执行程序时如何使用动态库
1) 将你生成的库放入系统库目录下
2) 修改环境变量export LD_LIBRARY_PATH=你库文件的位置
3) 添加/etc/ld.so.conf.d/*.conf 然后调用ldconfig 刷新库文件加载目录
五.相关指令
1. printenv echo
可以使用这两个命令查看 环境变量
printenv LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
2. ldd
可以使用这个命令查看,某个可执行程序使用了那些动态库。
|