C++ 动态库与静态库

面试被问到但是一窍不通,特来学习一下

静态库

概念

在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。

LINUX下的静态库

Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。

静态库的打包流程

1.先将需要生成库文件的所有文件编译成.o文件:
gcc -c a.c b.c c.c (不包含主函数的文件)
2.创建静态库(使用ar命令)
ar crv libmytest.a a.o b.o c.o
3.静态库的使用
gcc -o main main.c -L. -lxxx

WINDOWS使用静态库流程(vs 2019)

https://blog.csdn.net/m0_62833450/article/details/124738175

动态库

动态库的打包流程

1.先将需要生成库文件的所有文件编译成.o文件:
gcc -c a.c b.c c.c (不包含主函数的文件)
2.创建动态库
gcc -shared -o libmymath.so a.o b.o
3.动态库的使用
gcc -o main main.c -L. -lxxx

这时候我们发现运行./main时,会报错
在这里插入图片描述
能够成功编译,但是运行却报错了,为什么呢?
我们通过ldd命令列出动态库依赖关系,发现是not found。虽然已经告诉了编译器库文件和头文件的路径所在位置,但是当编译器编译好后,就与编译器无关了;当我们执行(运行)可执行程序a.out时,是由加载器来完成的。所以我们需要在运行时,告诉系统库文件在哪里;

在这里插入图片描述

解决方法:
1.打包到user/lib目录下
2.更改 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/mlg/lesson5-动静态库/friend/lib

LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径.注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找;

WINDOWS使用动态库流程(vs 2019)

https://blog.csdn.net/modi000/article/details/121786676?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168576335816800188586940%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168576335816800188586940&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~hot_rank-2-121786676-null-null.142v88insert_down28v1,239v2insert_chatgpt&utm_term=vs2019%E7%BC%96%E8%AF%91%E5%88%B6%E4%BD%9Cdll%E5%8A%A8%E6%80%81%E5%BA%93&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值