静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M展开100次,就是1G,但是这样的好处就是静态加载的速度快
动态库会将动态库加载到内存,10个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存
动态库和静态库各有优劣,根据实际情况合理选用即可。
静态库制作
静态库名字以lib开头,以.a结尾
例如:libmylib.a
、、
第一步:先写好源代码,然后编译汇编成.o文件
第二步:生成指令ar rcs libmylib.a file1.o
第三步:使用静态库(这里没有申明这三个函数,编译器使用隐式申明出现警告)
加上函数申明就不会警告
左边的define为头文件守卫,防止在代码中多次include头文件,多次展开静态库,带来的额外开销
、、下面将静态库和头文件分别放至其他目录下
、、
可以看出a.out内存远远大于test.c。
动态库
第一步:生成位置无关的.o文件
gcc -c add.c -o add.o -fPIC
使用这个参数过后,生成的函数就和位置无关,挂上@plt标识,等待动态绑定(进入内存后才有地址)
第二步:使用gcc -shared 制作动态库
gcc -shared lib库名.so ?.o...
第三步:编译可执行程序,指定所使用的动态库。-l:指定库名,-L:指定库路径
gcc test.c -o a.out -lmymath -L./lib
第四步:运行程序会出错
、、
动态库错误解决
错误原因:(这两个没有关联关系)
链接器:工作于链接阶段,工作时需要-l和-L
动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置
通过环境变量:export LD_LIBRARY_PATH=动态库路径(临时)
但是这个时临时的,重启终端就失效了
、、
解决方法
、
永久生效:写入终端配置文件 .bashrc
(1)vim ~/.bashrc
(2)写入 export LD_LIBRARY_PATH=动态库路径 (修改后路径不同也会出错)
(3). .bashrc||source .bashrc (重启终端,让修改的bashrc生效)
、
拷贝自定义动态库 到 /lib (标准C库所在目录位置)
、
配置文件法
1)sudo vi /etc/ld.so.conf
2)写入 动态库绝对路径 保存
3)sudo ldconfig -v 使配置文件生效。
4)./a.out 成功!!!--- 使用 ldd a.out 查看