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 中?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ VS2015 中嵌入 Python

无法在 VS 2015 中创建 C++ ConsoleApplication 或 C++ EmptyProject

VS2015 中任何和所有 C++ 项目的“打开 SDF 文件时出错”

VS2010之C++

如何检查是不是所有字段都已填写? [C++,VS 2015,Windows 窗体]

VS 2015 C++ Redistributable 不在单个 DLL 中?