静态库与动态库、编译时库与运行时库RuntimeLibrary

一、静态库与动态库

1.静态库(static library):

①后缀名:Linux下.a,Windows下.lib
②静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
③在编译的链接步骤中,连接器将从静态库文件中取得所需的代码,复制到生成的可执行文件中。因此,整个库中的所有函数都被编译进了目标代码中。

静态链接后,执行程序中存在自己所需函数的一份拷贝

2.动态库(共享库,shared library):

①后缀名:Linux下.so,Windows下.dll
②动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。gcc在编译时默认使用动态库。
③在编译的时候并没有被编译进目标代码中,而是程序执行到相关函数时才调用库中对应的函数。

动态链接后,执行程序仅仅是包含对共享库的一个引用。

3.区别与联系

1)区别:
①静态库大,动态库小
静态库是编译链接时装载。动态库是运行时装载
③静态库编译完成之后,完全不依赖于静态库,即便删除了静态库,程序仍然可以正确执行,但是动态库不一样,编译好的程序的运行需要依赖于外部动态库的存在。程序在运行时会按照一定的顺序寻找所需要的动态库。
④动态库能够更有效的利用内存。如果对库文件进行修改,我们也不需要重新编译程序

2)联系:
①不管是静态库,还是动态库,都是由*.o目标文件生成的,都是一个obj文件的集合

对比静态库动态库
后缀名.a.so
命名方式libxxx.alibxxx.so
生成工具ar工具 (archive)gcc工具(-shared)
代码被载入的时刻编译过程中被载入可执行程序可执行程序运行时才载入内存(编译过程中仅简单的引用)
生成可执行程序体积较大较小
优点①编译后的执行程序无需外部的函数库支持(删除静态库对可执行程序无影响)①不同的应用程序若调用相同的库,那么内存里只需一份该共享库 ②动态库的改变不影响可执行程序【随时可升级库】(共享对象接口相同,即可直接动态加载)
缺点①若静态库改变则程序需重新编译①程序运行时才被载入,故运行时需动态库存在

二、编译时库与运行时库

1.编译时库(CompiletimeLibrary)

曾教授说boost库大部分是编译时库,但我没查到相关资料。

2.运行时库(RuntimeLibrary)

release/MTdebug/MTd

MT__StaticRelease:多线程(/MT)
MD_DynamicRelease:多线程DLL(/MD)
MTd__StaticDebug:多线程调试(/MTd)
MDd__DynamicDebug:多线程调试DLL(/MDd)

在这里插入图片描述

Runtime Library就是运行时库,也简称CRT(C Run Time Library)。是程序在运行时所需要的库文件,通常运行时库是以Lib或Dll形式提供的。

在C Runtime Library出现之前,许多程序都使用C编写,而这些程序都要使用标准的C库,按照以前的方式每一个程序最终都要拷贝一份标准库的实现到程序中,这样同一时刻内存中可能有许多份标准库的代码(一个程序一份),所以微软出于效率的考虑把标准C库做为动态链接来实现,这样多个程序使用C标准库时内存中就只有一份拷贝了。

确切地说运行时库指的就是对这些底层的基础功能实现的动态库(Dll),运行时库和普通的Dll一样,只有程序用到了它才会被加载,没有程序使用的时候不会驻留内存的。话虽如此,但有多少系统的东西说不定也是用C写的,这些东西的存在就使C运行时库存在于内存中了,所以运行时库几乎总是需要的。虽然说运行时库应该是动态库,但习惯上我们把与动态运行时库相同代码编译出来的静态库也称为运行时库,因此VC++下的运行时库有ML、MLd、MT、MTd、MD、MD六种
运行时库参考阅读文章

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C++运行时动态链接是C++编程中常用的两个概念。 C++运行时(C++ Runtime Library)是一组预编译的函数和类,用于支持C++程序的运行。它包含了一些常用的函数和类,如输入输出、字符串处理、内存管理等。C++运行时分为两种类型:静态链接动态链接静态链接(Static Linking)是在编译的代码和程序的代码合并在一起,生成一个独立的可执行文件。这意味着程序在运行时不需要依赖外部的文件,所有的代码都被包含在可执行文件中。静态链接的优点是简单、方便,但缺点是可执行文件会变得较大,且每次更新都需要重新编译整个程序。 动态链接(Dynamic Linking)是在程序运行时才加载和链接的文件。程序在运行时通过动态链接器(如Windows的DLL、Linux的SO)加载文件,并将中的函数和程序进行链接。动态链接的优点是节省了可执行文件的大小,且可以在不重新编译程序的情况下更新文件。但缺点是需要依赖外部的文件,如果文件不存在或版本不匹配,程序将无法正常运行。 在C++中,标准(如iostream、string等)和一些第三方(如Boost、OpenCV等)都是以动态链接的形式提供的。使用动态链接可以减小可执行文件的大小,并方便的更新和维护。 相关问题: 1. 如何使用C++运行时? 2. 如何使用静态链接? 3. 如何使用动态链接? 4. 动态链接静态链接有什么区别?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值