[C/C++] 关于 vcredist 的那些事

[C/C++] 关于 vcredist 的那些事想必大部分人都经历过运行某程序缺少"XX.dll"的情况,并且最烦人的是当你从网上下载了对应的DLL后,程序又提示缺少其他文件,于是你不得不重复上述操作……不过我相信你们在网上搜索到的关于应对这种情况的方法可能都是下载诸如"vcredist_xxx"

大家好,欢迎来到IT知识分享网。

  想必大部分人都经历过运行某程序缺少 “XX.dll” 的情况,并且最烦人的是当你从网上下载了对应的 DLL 后,程序又提示缺少其他文件,于是你不得不重复上述操作……不过我相信你们在网上搜索到的关于应对这种情况的方法可能都是下载诸如 “vcredist_xxx” 之类的运行库合集。

  不管你是用哪种办法解决文件缺少的问题,即 “怎么做” 大家已经知道了,但是 “为什么这样做” 我猜很多人都没有搞清楚,所以我写了这篇文章。

  如果你对你的英语水平有自信,或者不介意使用机器翻译的话,请看这里 Determine which DLLs to redistribute ,本文就是基于它所写成的。


 1 什么是 DLL(Dynamic Linked Library,动态链接库)?

  本文假定读者对计算机的相关知识有一定的了解,但依然会对有些简单的概念做基本的介绍。大家一定知道程序是由代码“转化”而来,说得明白点,编译器将使用自然语言写成的代码翻译成计算机看得懂的指令,而这些指令就组成程序的主要部分,运行某个程序就相当于在执行一系列指令。其中,有些代码实现的功能被反复用到,为了重复利用它们,不妨将它们对应的指令从原来的程序中分离出来,以供多个程序同时使用,这样也能减少程序的大小。大家学 C / C++ 一定知道标准库,C 有 stdio,C++ 有 iostream,它们其实就是以 DLL 的形式提供的,所以这就是为什么你写了一个几百行甚至几千行的程序(仅使用标准库),但是最后编译出来大小只有几十 KB 的原因。


2 什么是 redist (redistributable package,可再发行组件包)?

  因为 C / C++ 标准库的具体实现被封装进好多不同的 DLL 内部,且它们的版本也各有区别,如果开发者只拷贝所需的 DLL 到他所发布的程序的文件夹里,就会至少面临两个问题: 第一,如何知道自己的程序需要哪些 DLL?第二,如果使用的 DLL 版本更新了怎么办?所以就有了 redist。它把所有可能会用到的 DLL 捆绑成包并以统一的版本号(比如年份,像2005、2008之类的)发布。这样开发者只需让用户按照对应的 redist 即可,而且通常它都是安装到系统目录里的,一次安装就能解决好多程序的依赖问题。


3 redist 里有什么?

  大家或许对 msvcp、msvcr、vcruntime 之类的名词不陌生,它们正是 redist 的组成部分,如果你对它们各自的用途感兴趣的话,请参照开头给出的网址里的文章中的表格(我这里也提供了截图):

[C/C++] 关于 vcredist 的那些事

文中没有提到 msvcr,不过从英文缩写可以很容易推断出来它应该是 “C Runtime”,和 msvcp 的 “C++ Runtime” 相对应。所以你也可以从程序所使用的 DLL 大致推断出它是基于 C 还是基于 C++ 的。


本文到这里就结束了,如果想了解更多细节,推荐研究一下开头给出的那篇文章。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30602.html

(0)
上一篇 2023-10-20 09:45
下一篇 2023-10-25 10:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信