熟悉windows环境编程的人都晓得 windows环境下的静态库是.lib结尾的 而动态库是以.dll结尾
在Linux环境下 静态库是以.a 结尾 而动态库是以.so.结尾以可以加版本后缀
calc.h
#ifndef _CALC_H
#define _CALC_H
extern int add(int,int);
extern int sub(int,int);
#endif
calc.c
#include "calc.h"
int add(int x, int y) {
return (x + y);
}
int sub(int x, int y) {
return (x - y);
}
生成静态库的过程:
gcc -c -o calc.o calc.h -I./
ar -cr libcalc.a calc.o
测试静态库的代码:
amain.c
编译 :gcc -o amain amain.c -lcalc
出现如下错误:
链接静态库的时候找不到 找不到静态库
重新编译: 命令如下
执行测试程序./amain
执行结果如下:
以上把calc.c生成静态库
生成的amain文件的大小如下
下面把calc.c生成动态库:
gcc -fPIC -c -o dynamic_calc.o calc.c
gcc -shared -fpic -o libdynamic_calc.so dynamic_calc.o
ls 查看生成动态库
测试动态库dmain.c
编译测试程序: gcc -o dmain dmain.c -L./ -ldynamic_calc
执行 ./dmain
error :
原因是 在加载动态库的时候 搜索路径是在LD_LIBRARY_PATH中找
a.可以把动态库copy到/usr/lib/目录下
b.把该动态库所在的路径加入到环境变量中
vim /etc/profile
注意LD_LIBRARY_PATH与=之间不要有空格
保存后 执行 source /etc/profile
再执行 与上面得到的结果相同
使用静态库与动态库可执行程序的大小比较
其中amain是使用静态库生成的可执行程序 dmain是使用动态库生成的可执行程序 现在库不是很大 大小差异不是很大 如果库很大 差别很明显
使用动态库的好处:
a.节约物理开销
1.可执行程序占用的磁盘空间小
2.可执行程序加载到内存的时候 也占用较小的内存空间
b.版本更新容易 无需重新编译 【如果源代码修改 需要重新编译】
c.运行再确定使用哪个库 使得程序中添加跟删除一个模块时 不需要再次编译制定库.
如果动态库无法加载
1.路径问题
2.依赖的问题
在程序中可以用代码的形式直接加载动态库 ——源代码
执行并运行结果如下: