Visual Studio C++ - 如何避免使用Visual C++ Redistributable Packages?

3
当我在一台全新安装的电脑上运行我的程序时,它告诉我需要安装Visual C++ Redistributable Package 2015(即MSVCP140.dll)才能运行我的动态链接程序。
我知道静态链接可以解决这个问题-但是,它会使我的可执行文件大小翻倍。
难道没有办法抑制Visual Studio功能,使红色分发包不必要并仍然使用Visual Studio编译器,因为我不习惯像mingw等替代品吗?
或者红色分发包实际上包含STL吗?我几乎无法想象。

被标记为重复,即使链接的问题是针对另一个版本的Visual Studio,它仍然适用。 - peterchen
如上所述,我确实理解静态链接可以解决问题。但我的问题是,如果我只使用STL功能,为什么需要提供任何DLL/redist包呢?redist包是否包含STL? - user66875
哦,好的。是的,我之前看到过提到标准库包含一些常用算法和类型的特化版本。(例如,可以手动启用特定优化的模板的特化版本,或者是那些如此常见以至于它们的代码应该驻留在运行时而不是每个二进制文件中的类型。) - peterchen
2个回答

4
据我所知,你只有两种选择: 1. 静态链接 - 没有dll依赖,但是文件体积巨大。 2. 动态链接 - 需要对应的dll文件,可执行文件相对较小。
至于第二种方法,你还有两种选择: 1. 单独安装redist包。 2. 将这些dll文件放在与exe文件相同的目录中。从微软的角度来看,“合法”(私有组件?)。
希望能帮到你。

1
“redist packages”基本上包含库。如果您不使用任何库功能,则不需要它们,但是否则没有办法-您不能调用库函数然后没有它。
这意味着删除所有带有<>的包含文件,然后您就可以了。
请注意,如果您确实使用库函数,那几乎不是一个选项-您真的不想自己重新编写strlen、fopen等函数。

你所说的库是指STL吗?我正在使用大量STL功能,如<iostream>、<vector>等。但是为什么这些需要redist包呢?我的意思是,如果我使用mingw编译它,就不需要分发任何redist包或dll文件,对吧? - user66875
是的,所有这些std东西背后的功能都在可再分发文件中。你要么拥有它们,要么静态链接功能(这样你的可执行文件会变大)。它必须来自某个地方。- 我对mingw一无所知。 - Aganju
@user66875 - mingw确实使用一组DLL,但它被设计为使用与Windows本身相同的一组。您的问题在于您正在向某些计算机引入新的编译器版本。然后,您将不得不安装新的运行时,仅需安装一次即可。下一个安装的程序将免费获得它。 - Bo Persson
需要注意的是,mingw所做的事情是违反规则的。:-) 微软可能不会有意破坏mingw程序,但他们也不能保证这些程序能够继续运行。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接