【问题标题】:Why is the Visual C++ Redistributable Package Required?为什么需要 Visual C++ Redistributable Package?
【发布时间】:2014-12-05 04:51:52
【问题描述】:

如果由可视化 C++ 编译器编译的代码是纯 C++,为什么需要可再发行包?这是否使您的代码平台依赖?使用带有可再发行包的可视化 C++ 编译器是否比使用其他 IDE 和 g++ 有任何优势?

【问题讨论】:

  • 编译后的代码总是依赖于平台。它适用于并且仅适用于为其编译的平台。
  • 不是必需的。您应该改为创建一个安装项目。或者用 /MT 而不是 /MD 编译,这样你就根本不需要它了。但是,当您使用 DLL 时会有风险。

标签: c++ visual-c++


【解决方案1】:

代码不依赖于平台,生成的可执行文件是。它通过标准库实现与 MS 库链接,这些库作为 DLL 包含在可再发行组件中。

IIRC 应该有一个用于静态链接所有内容的选项,这样您就不需要额外的可再发行组件,但生成的二进制文件仍然依赖于平台 - 例如,您不能在 UNIX 系统上运行 Windows 二进制文件(至少没有 WINE)。

【讨论】:

  • 您可以选择在每个应用程序中包含内存管理器、标准 I/O 库以及诸如单独的副本,但没有好的方法来管理和升级它以及大量的膨胀,或者为每个可能需要它的应用程序安装一次包含所有代码的单个运行时。
  • @DavidSchwartz 是的...而且我认为它默认包含在所有 Windows 安装中,对吗?
  • 这取决于哪个 Windows 安装和哪个运行时间。例如,新安装的 Windows Vista SP1(如果有人还在安装)将没有 VS2010 运行时。
  • 即使是全新安装的 Windows Server 2008 R2 也没有安装 VS 2010 运行时,或者至少我不记得有安装...这些是为了重新分发。但请注意,仍然可以使用 Microsoft 的 C/C++ 编译器创建可执行文件,该编译器链接到 C 运行时库,因此不依赖于它们的安装。
  • 不,没有优势。任何体面的 C++ 编译器都很好,微软和 G++ 都符合“体面”的标准。有些人谈论微软的编译器比 G++ 生成更好的 Windows 代码(也就是说,它更擅长优化/调整 Windows 应用程序的代码),但我不确定这样的事情是否有任何真相索赔。您必须对其进行分析并亲自查看。然而,任何差异都可能非常微小且几乎微不足道。如果您已经对 G++ 感到满意,那就坚持下去。如果你喜欢 VC++,也一样。
【解决方案2】:

没有“纯 C++”这样的东西。代码中总会有一些库函数被调用,即使你非常小心地不去调用,也会有一些函数需要由编译器发出的代码简单地调用。例如,如果您有以下循环:

for( int i = 0;  i < count;  i++ )
    array1[i] = array2[i];

编译器会将其替换为仅复制内存的代码。如果你正在编译更小的尺寸而不是速度,这将是一个非常类似于 memmove() 的函数的调用。

另外,您可能有一些浮点运算不存在直接的 x86 等效指令;这些也将通过函数调用来实现。名单还在继续。

这不会使您的代码依赖于平台,因为在不同的平台上,该平台的编译器将编译您的相同代码,以适应该平台的 C++ 运行时。

幸运的是,C++ 运行时不必是与您的应用程序分开的实体。检查您的编译器和链接器选项;您应该能够生成包含两者的单个可执行文件。如果您发现 g++ 不需要单独的运行时,那是因为它默认就是这样做的。

【讨论】:

    【解决方案3】:

    C++ 可再发行组件特定于您正在使用的 IDE(我说的是“IDE”,但这确实特定于编译器,但随着事情的发展,IDE 和编译器都被分配了新版本。)

    它是特定于该 IDE 的,而不是特定于 Win OS。所以它应该是向后兼容的(假设你显然没有使用新的 API。)实际上,这样做是为了向后兼容(而不是你想的相反。)这允许你使用最新的最好的 IDE 版本(10、11、12...),仍然可以在 Win2k 上运行您的代码!

    现在,当然,它与 Linux 大不相同,在 Linux 中,您无论如何都需要在每个主要版本上重新编译。大多数 Unix 系统都可以这样工作。

    我不知道静态编译 C++ 以避免那些可再发行组件的方法。这可能是可能的,尽管它肯定会使您的 .exe 变得非常大。

    【讨论】:

      【解决方案4】:

      我总是在 xp 虚拟机上保留一份 Visual C++ 6 的副本(在 Win 6/7/8 中无法正常工作)。有时我写或被要求写一个实用程序来快速做某事和/或一次我编译为单个 exe。我厌倦了将仅使用 std lib 编写的简单程序发送给其他人,只是为了让他们告诉我由于缺少一些 dll 或可重新分发的包而无法正常工作。

      【讨论】:

        【解决方案5】:

        在您的项目属性、C/C++、代码生成中,将运行时库设置为 /MT 以用于您的发布版本。

        (感谢在 social.msdn 上回答此问题的 Mike Danes:https://social.msdn.microsoft.com/Forums/vstudio/en-US/09afd4be-7a15-4772-98c1-a0464a96cd7f/how-to-static-linkage-in-visual-c-express-edition-2010?forum=vcgeneral&prof=required

        【讨论】: