C/C++ 静态库和动态库的区别
2023-04-18 14:06:08 时间
可执行目标文件
可重定位目标文件
共享目标文件
静态库和动态库的区别:
生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中;动态库是在程序运行过程中指定路径或者系统动态库路径下寻找。
-lm 链接math动态库,在程序运行时去找系统动态库路径下的所有动态库,看有无要找的符号
比如静态链接:
gcc -static -o main main.o -lm
在这个过程中,就会用到系统中的静态库libm.a。这个过程做了什么呢?首先第一条命令会将main.c编译成可重定位目标文件main.o,第二条命令的static参数,告诉链接器应该使用静态链接,-lm参数表明链接libm.a这个库(类似的,如果要链接libxxx.a,使用-lxxx即可)。由于main.c中使用了libm.a中的exp函数,因此链接时,会将libm.a中需要的代码“拷贝”到最终的可执行文件main中。
由于最终生成的可执行文件中已经包含了exp相关的二进制代码,因此这个可执行文件在一个没有libm.a的linux系统中也能正常运行。
比如把-lm放在后面,链接器只会一直向后查找符号,如果-lm放前面,那么就会编译链接出错
ldd命令可以查看可执行文件链接了哪些动态库。
动态库和静态库类似,但是它并不在链接时将需要的二进制代码都“拷贝”到可执行文件中,而是仅仅“拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程。
静态库中被使用的目标代码最终和可执行文件在一起(它只会有自己用到的),而动态库与它相反,它的目标代码在运行时或者加载时链接。
相关文章
- 让智能“无处不在”,微软Azure今年有哪些更新?
- ROS2极简总结-核心概念(二)
- 2022来了,别做没头脑的软件架构师
- ROS2极简总结-新增概念
- 2021年,苹果成为企业科技领域的大玩家
- ROS2极简总结-文件系统
- ROS2极简总结-命令行接口基础
- ROS2极简总结-MoveIt2
- ROS2极简总结-导航简介-自定位
- AI巨头商汤科技今日上市!募资55.52亿港元,上市前暗盘破发
- JetBrains 推出“下一代 IDE”,快看看有哪些值得期待的功能!
- 工业互联网三大阵营的「竞」与「合」
- ROS2极简总结-坐标变换-TF
- ROS2极简总结-SLAM
- Microsoft Ignite China 2022来了,“课代表”为你划重点
- ROS2极简总结-Nav2-行为树
- 如何批量生成二维码
- 收益不止 美国五大科技公司年营收有望达到9万亿
- 瞬息万变的互联网行业中,程序员应具备什么能力?
- 英伟达神秘「变形」GPU曝光!5nm工艺,两种形态随心变