当前位置:   article > 正文

静态库与动态库、编译时库与运行时库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六种
运行时库参考阅读文章

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/722582
推荐阅读
相关标签
  

闽ICP备14008679号