一》静态库的创建和使用:
静态库的制作
1>. 命名规则
1). lib + 库的名字 + .a
2). libmytest.a
2>. 制作步骤:
1). 生成对应的.o文件 -- .c --> .o -c
2). 将生成的.o文件打包 ar rcs + 静态库的名字(libMytest.a) + 生成的所有的.o
3>. 发布和使用静态库:
1). 发布静态库
2). 头文件
1.整体浏览下整个需要用到的目录:
看到这里,我们知道include这个目录存放的是动态库的头文件,lib目录中存放的是静态库,src目录中存放的是源码(src这个目录是自己私有的,lib和include目录打包出售),test目录就是测试了。
2:具体看看这些目录:
1)include目录:
2)src目录:
add.c
#include"head.h"
int Add(int num1,int num2)
{
return num1+num2;
}
sub.c
#include"head.h"
int Sub(int num1,int num2)
{
return num1-num2;
}
mul.c
#include"head.h"
int Mul(int num1, int num2)
{
return num1 * num2;
}
div.c
#include"head.h"
int Div(int num1, int num2)
{
assert(num2);
return num1/num2;
}
注意:这里的-I选项是引入头文件,因为头文件不在本目录下,所以需要手动的引入头文件的目录。
将所有的目标文件打包成静态库,静态库的名字为mylib
3)lib目录:
通过ar -t可以查看libmylib.a中有几个目标文件。
4)test目录:
libatest.c
#include<stdio.h>
#include"head.h"
int main()
{
int num1 = 20;
int num2 = 30;
printf("num1+num2 = %d\n",Add(num1, num2));
printf("num1-num2 = %d\n",Sub(num1, num2));
printf("num1*num2 = %d\n",Mul(num1, num2));
printf("num1/num2 = %d\n",Div(num1, num2));
return 0;
}
静态库的第二种使用方式:
-L表示静态库的目录,-l表示要引用那个库(注意这里的库名,把前面的lib去掉,把后面的.a弃掉)。
3.结果:
4.静态库的优点和缺点:
二》动态库的创建和使用:
共享库的制作:
1>. 命名规则:
1). lib + 名字 + .so
2>. 制作步骤:
1). 生成与位置无关的代码 (生成与位置无关的.o)
2). 将.o打包成共享库(动态库)
同样的使用上面静态库的四个目录来演示动态库的创建和使用:
1)src目录:
2)用gcc生成动态库:
-shared: 表示要生成动态库。
3)编译和运行测试程序:
方式二:(ldd:查看程序执行的时候所依赖的所有的共享库。)
解决方案一:将动态库拷贝放到/lib中。这种方式不推荐使用,有可能会覆盖系统的库。
解决方案二:将动态库的目录加入到LD_LIBRARY_PATH环境变量中,程序每次查找动态库先会到这个环境变量中所指路径中查找,
再到PATH环境变量所指的路径中查找。但是这种方式是临时的,关闭终端后,就无效了。
解决方案三:将你的动态库的绝对路径加入到~/.bashrc,关闭终端后才生效,此时是永久有效的。
解决方案四(企业中常用的方式):到/ect下找到你的动态链接器的配置文件,将动态库的绝对路径写到这个配置文件中,更新这个配置文件。
更新这个配置文件:
4)动态库的优缺点: