Linux 静态库&动态库的使用

熟悉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
Linux 静态库&动态库的使用_第1张图片

编译测试程序: 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.依赖的问题

在程序中可以用代码的形式直接加载动态库 ——源代码


执行并运行结果如下:


你可能感兴趣的:(Linux 静态库&动态库的使用)