Visual Studio 2010 MSVCR依赖项删除?

dor*_*rey 14 c++ windows dll dependencies visual-studio-2010

我试过谷歌这个,但我找不到解决方案.我正在尝试学习一些基本的C++.我写了一个简单的hello世界:

#include <stdio.h>
int main()
{
    printf("hello, world\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它完美编译了一切!太棒了,我想,所以我用XP加载了我的虚拟机,没有安装任何服务包,然后尝试运行它.它告诉我,我需要MSVCR DLL.有什么办法可以完全消除这种依赖吗?我不想用dll填充程序.我希望它完全消失.是否可以制作和运行将在XP及更高版本中运行的程序?谢谢.

Cod*_*ray 20

在技​​术上可以在C中删除这种依赖,但我不确定它在C++中是否可行.在任何一种情况下,我都不会推荐它.你失去了CRT在幕后为你做的很多东西,其中大多数你不想以一种低级的方式重塑自己.对于初学者来说,它是实际调用main函数的运行时库,以及调用全局和静态C++对象的构造函数和析构函数.

最好和最简单的解决方案可能是改变应用程序链接到运行时库的方式.您有两种不同的选择:动态和静态.动态链接更具内存效率,意味着您的应用程序将利用对库进行的任何错误修复.它依赖于运行时DLL,以便您的应用程序启动.静态链接实际上在构建的链接阶段将运行时库代码嵌入到应用程序中.这意味着您可以在不分发DLL的情况下运行,但有一些重要的警告.

对于简单的应用程序,这些警告不太可能相关.更改项目选项中使用的链接样式:

  1. 在解决方案资源管理器中右键单击项目名称.
  2. 展开左侧树视图中的"C/C++"选项,然后选择"代码生成"项.
  3. 在"运行时库"属性组合框中,选择"多线程"选项之一.
    调试版本应使用"多线程调试",而版本版本应使用"多线程".

请注意,由于您使用的是VS 2010,因此您仍然可以选择动态链接到运行时并获得这样做的所有优势,而无需在目标计算机上运行CRT安装程序.您只需要将可再发行的DLL放入与应用程序可执行文件相同的文件夹中.这使得部署(甚至测试)变得非常简单和直接.您将在Visual Studio安装中找到这些库:

\Program Files\Visual Studio x.0\VC\redist\
Run Code Online (Sandbox Code Playgroud)

当然,CRT的调试版本永远不可再发行.由于您不应该分发应用程序的调试版本,因此这不是问题.确保您已经编译了"Release"版本(使用顶部工具栏中的下拉组合框),您只需要在上面的目录中找到可再发行的库.


我不能使用XP附带的运行时吗?

任何版本的Windows都没有使用C运行时.Windows本身确实依赖于C运行时库,但它部署了该库的私有版本供自己使用.应用程序无意链接到它或以任何方式使用它.您可以自行部署所有必需的依赖项,正如您所注意到的,您不能假设目标计算机已经安装了正确的版本.


Kar*_*nek 5

您可以静态链接 MS 运行时,项目选项 -> C/C++ -> 代码生成 -> 多线程(或多线程调试用于调试配置)。那时不需要 DLL。

  • 您无法避免 C++ 运行时。它就是调用你的`main()` 函数的东西。 (3认同)
  • @Cody Gray:编译后的可执行文件大小且没有依赖项。`int main(){return 0;}` 会产生 16kB 的可执行文件,可以压缩成 2..6kB,唯一的依赖是 msvcrt.dll,它是系统组件。您甚至可以摆脱这种依赖并制作自己的精简 crt(依赖于 GlobalAlloc 或 VirtualAlloc 等系统函数并使用 _tmaincrtstartup),它会更小,但在这种情况下,它会变得更加复杂。当然,所有这些技巧只有在您对应用程序有非常独特的要求时才有用(可能是有大小限制的演示竞赛?)。 (2认同)
  • @Cody msvcrt.dll 是 MSVC6 运行时,从 Win2k 开始随 Windows 一起提供。使用起来完全没问题。说你不应该链接到系统提供的 DLL 是奇怪的。您是否建议我们停止链接到 user32.dll 等? (2认同)