VS 2015 C++ Redistributable 不在单个 DLL 中?
Posted
技术标签:
【中文标题】VS 2015 C++ Redistributable 不在单个 DLL 中?【英文标题】:VS 2015 C++ Redistributable not in a single DLL? 【发布时间】:2016-06-16 21:09:14 【问题描述】:假设我使用 Visual Studio 2015 将以下 C++ 代码构建到 HelloWorld.exe
中,目标版本为 x64 平台。
#include <iostream>
int main()
std::cout << "Hello world!!" << std::endl;
return 0;
几年前,我可以简单地复制 msvcp###.dll
(或 C 的 msvcr###.dll
)和 HellowWorld.exe
并拥有一个可运行的程序。
我刚刚安装了VS2015,现在看来我不能只带msvcp140.dll
。我的 System32
文件夹中似乎有 70~ish api-ms-win-.....dll
文件需要随附。
我知道最好的策略是让他们安装可再发行组件...但是对于他们无法安装的情况,复制 .DLL 曾经是一种可行的替代方案。还是这样吗?我错过了一些简单的东西吗?
总结一下:我原以为我可以复制msvcp140.dll
并让它工作,但事实似乎并非如此。我错了吗?
注意:我在 list of things you are allowed to redistribute 中看不到 api-ms-....dll
文件。或者它是否理解这是 2015 运行时的一部分并且随之而来?
【问题讨论】:
不。它充满了 DLL、调试 DLL、多线程 DLL 和各种 smurfing 类型的 DLL。您还希望这些 DLLS 受到保护并远离简单的篡改,因为只需快速更换文件,您的 PC 就会受到 Borg Collective 的欢迎。 你没有错。只需进行静态构建,然后告诉任何抱怨文件大小的人获得一台新计算机。 【参考方案1】:我倾向于静态链接运行时(/MT 和 /MTd 编译器选项),而不是安装可再发行组件。
它确实会导致更大的文件大小,但它远小于提供 DLL。
【讨论】:
【参考方案2】:您可以使用安装程序分发 VC 2015 可再发行组件。
https://www.microsoft.com/en-us/download/details.aspx?id=48145
如果这不是一个选项,静态链接它。
您还可以运行依赖项来确定您需要的其他 DLL。您可以忽略 api-ms*.dll 的:Dependency Walker: missing dlls
【讨论】:
以上是关于VS 2015 C++ Redistributable 不在单个 DLL 中?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 VS 2015 中创建 C++ ConsoleApplication 或 C++ EmptyProject
VS2015 中任何和所有 C++ 项目的“打开 SDF 文件时出错”