add.c div.c mult.c sub.c
动态库的制作
1.先将需要生成库文件的所有“.c”文件编译成“.o”文件
gcc -c -fpic/fPIC add.c div.c sub.c mult.c
2.使用gcc命令将第一步编译的所有“.o”文件生成动态库
gcc -shared add.o div.o mult.o sub.o -o ../lib/libcalc.so
动态库的使用
1.生成可执行文件,其中“-L”指定库的存储路径,“-l”指定库的名称(不需要“lib”和扩展名“.so”),如果在库的存储路径有同名的动态库和静态库,gcc默认使用动态库
gcc main.c -o main -I ./include -L ./lib -l clac
2.执行方法:
程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系
可以看到并没有指定共享库的路径
当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路
径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是
由ld-linux.so来完成的,它先后搜索elf文件的 DT_RPATH段 ——> 环境变量
LD_LIBRARY_PATH ——> /etc/ld.so.cache文件列表 ——> /lib/, /usr/lib
目录找到库文件后将其载入内存。
通过以下五种方法可以指定共享库的路径
(1)临时修改Linux环境变量LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/动态库所在目录(替换成自己的)
(2)用户层次上更改Linux环境变量
在用户目录下有.bashrc(该文件为隐藏文件)文件,在最后一行添加以上语句
vim /home/用户名称/.bashrc
或
vim ~/.bashrc
完成后需要更新环境变量
source ~/.bashrc
(3)系统层次上更改Linux环境变量
sudo vim /etc/profile
打开文档后,在最后一行填写以上语句,同时更新环境变量
source /etc/profile
(4)通过修改/etc/ld.so.cache文件列表来使用动态库
sudo vim /etc/ld.so.conf
将路径加载到文档中
更新
sudo ldconfig
(5)将动态库存放到/lib/或者/usr/lib目录下(不推荐,可能会与系统本身自带的库文件混淆,出现一些不必要的问题)
静态库和动态库的对比
静态库在链接时将用到的方法包含到最终生成的可执行程序中,而共享库不包含,只做
标记,在运行程序时,才动态加载。
1.静态库的优缺点:
- 优点:被打包到应用程序中加载速度快;发布程序无需提供静态库,移植方便
- 缺点:消耗系统资源,浪费内存;更新、部署、发布麻烦
2.动态库的优缺点:
- 优点:可以实现进程间资源共享(共享库);更新、部署、发布简单;可以控制何时加载动态库
- 缺点:加载速度比静态库慢;发布程序时需要提供依赖的动态库