c++ - Visual Studio 2010 MSVCR 依赖删除?

标签 c++ windows visual-studio-2010 dll dependencies

我试过用 Google 搜索,但找不到解决方案。我正在尝试学习一些基本的 C++。我写了一个简单的hello world:

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

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

最佳答案

在技术上可能在 C 中删除这种依赖关系,但我不确定在 C++ 中是否可能。无论哪种情况,我都不会推荐它。你失去了很多 CRT 在幕后为你做的事情,其中​​大部分你不想以低劣的方式 reshape 自己。对于初学者来说,实际调用 main 函数以及调用全局和静态 C++ 对象的构造函数和析构函数的是运行时库。

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

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

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

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

\Program Files\Visual Studio x.0\VC\redist\

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


Can't I use the runtime that comes with XP?

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

关于c++ - Visual Studio 2010 MSVCR 依赖删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052694/

相关文章:

c++ - 需要 OOP C++ 帮助

c++ - 使用邻接表创建图

c++ - 如何避免显示浮点: -0. 0

java字节数组转换为字符串,但在不同的操作系统中结果不同

visual-studio-2010 - 单元测试适配器抛出异常 : Unable to load one or more of the requested types

c++ - 为什么元编程很重要?脚本代码生成不是更容易吗?

windows - Wix Toolkit - MSI 安装程序 - 启动安装的应用程序时不断出现窗口弹出窗口

c++ - 当用户在 metro 中时,桌面应用程序需要关注

c++ - 使用我自己的源目录生成 vs2010 项目文件

visual-studio-2010 - 错误 'Newtonsoft.Json.Linq.JToken' 无法使用 TombstoneHelper 序列化