首页 > 编程知识 正文

关于静态库和动态库的区别,什么是静态库

时间:2023-05-05 16:27:42 阅读:230585 作者:4667

动静态库所用到的一些库文件:
.o 是目标对象文件,相当于windows中的.obj文件。可由一个或多个.c /.cpp来生成

.a 为静态库,可以是一个或多个.o合在一起,用于静态连接;多个.o文件可以链接生成一个.exe的可执行文件。静态库在程序编译时会被连接到目标代码中,相当于将你使用库里的函数加载到程序里,在编译的时候直接编译进去,这样,在编译之后执行程序时将不再需要该静态库。编译之后程序文件大,但加载快,隔离性也好。所以它的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为它的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

.so 为动态库(共享库),类似windows平台的.dll文件。动态库在程序编译时并不会被连接到目标代码中,而是在编译时仅引用,体积小,在程序运行到相关函数时才调用函数库里的相应函数,才被载入,因此在程序运行时还需要动态库存在。多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可。

静态库与动态库的区别:
1) 最大区别: 加载的时刻不同
静态库在程序编译阶段加载,可能使目标程序变大
动态库在程序运行阶段加载,目标程序相对较小。
2) 静态库编译完成可以删除库文件
动态库编译完成必须保留库文件
3) 接口文件一致,创建目标文件过程一致。
制作库文件命令不同,使用流程不同
4) 不论是静态库还是动态库都存在潜在的隐患。

#静态库的简单使用#
1)编写功能函数功能实现 不能有main函数
hello.c 只做一个hello功能。
hello.h 接口文件,用于声明功能函数。
2)编译功能函数为目标文件:
gcc -c hello.c -o hello.o
3)使用目标文件制作静态库:
ar crs libhello.a hello.o
注意:目标静态库必须以lib开头,以.a 结尾。
4)使用静态库:
4.1 编写测试单元main.c
4.2 将测试代码与库同时编译
gcc main.c -L. -l hello
4.3 验证库的执行效果
./a.out
备注:
-L. :表示当前路径;
-l :后面跟库文件名字;


#动态库的简单使用#
1)编写功能函数
hello.c
hello.h
(函数同上静态库的使用)
2)将功能函数编译成目标文件
gcc -fPIC -c hello.c
3)制作动态库
gcc -shared -fPIC hello.o -o libhello.so
4)使用测试环境测试动态库
4.1 )编写main.c 测试代码
4.2 )拷贝目标动态库到系统路径
cp libhello.so /usr/lib
若提示permission denied,使用sudo权限
或者改变环境变量
export LD_LIBRARY_PATH=/mnt/nfs/1615/io/06
4.3 )编译测试单元
gcc main.c -L. -l hello
4.4 )执行测试单元
./a.out
总结
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。