linux下静态库和动态库的创建和使用

来源:互联网 发布:淮南大数据公司 编辑:程序博客网 时间:2024/04/30 09:03

一》静态库的创建和使用:

 静态库的制作
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;}


生成可执行文件libatest,需要引入头文件还需要引入静态库。

静态库的第二种使用方式:


-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)动态库的优缺点:


阅读全文
0 0