【问题标题】:Visual Studio 2010 MSVCR dependency removal?Visual Studio 2010 MSVCR 依赖删除?
【发布时间】:2012-02-21 14:05:47
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以删除烦人的运行时库,这样做:
    project properties &gt; linker &gt; input &gt; ignore all default libraries&gt; yes

    这将为您提供一些您需要处理的问题,例如,浮动 点数不起作用,堆栈内存非常小(大约 3k),没有针对缓冲区溢出等的内置帮助,如果不将标准库复制粘贴到您的项目。

    这也会减小.exe 的大小,几乎等同于手工制作 在装配中。

    【讨论】:

      【解决方案2】:

      在技术上可能在 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\
      

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


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

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

      【讨论】:

      • 所以我猜这不会允许它在没有安装最新运行时的情况下在 Windows XP 上运行。我试试这个,谢谢。
      • 避免提及 CLR,这里不相关。并指出部署建议仅适用于 VS2010,以前的版本使用 Windows 并行缓存。
      • @Hans:哎呀!那是一个错字,我的意思是CRT。并感谢您指出有关 VS 2010 的信息。
      【解决方案3】:

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

      【讨论】:

      • 您无法避免 C++ 运行时。正是它调用了您的 main() 函数。
      • @Cody Gray:编译后的可执行文件大小并且没有依赖关系。 int main(){return 0;} 会生成 16kB 的可执行文件,可以压缩成 2..6kB,唯一的依赖是 msvcrt.dll,它是系统组件。您甚至可以摆脱这种依赖并制作自己的精简 crt(依赖于 GlobalAlloc 或 VirtualAlloc 等系统函数并使用 _tmaincrtstartup),它会更小,但在这种情况下它会变得更加复杂。当然,所有这些技巧只有在您对应用程序有非常独特的要求时才有用(也许是有大小限制的演示比赛?)。
      • @Cody msvcrt.dll 是 MSVC6 运行时,从 Win2k 开始随 Windows 一起提供。使用起来完全没问题。说您不应该链接到系统提供的 DLL 很奇怪。您是否建议我们停止链接到 user32.dll 等?
      • @David:它不是 MSVC6 运行时,它只是具有相同的名称。 Microsoft 实际上一直在更新 Windows 系统组件的运行时库,添加一些以版本化名称部署的新功能。我不记得我在哪里读过它,但我有相对可信的权威,这个库旨在供 Windows 内部使用,而不可供应用程序使用。该理论至少得到了它的 .lib 文件未公开这一事实的支持。链接到私有 CRT 与 user32.dll 不同。
      • 我能找到的支持我的主张的最佳链接在这里:C Run-Time Libraries,上面写着 “msvcrt.dll 现在是一个“已知 DLL”,这意味着它是一个系统Windows 拥有和构建的组件。它仅供系统级组件将来使用。” 所有这些都来自于在应用程序和操作系统之间共享 CRT 时遇到的问题。您可以链接到此 DLL,但它不受支持且不推荐。系统 CRT 未针对一般用途进行测试或记录;安全更新可能会让您的应用失败。
      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2012-02-08
      • 2011-12-04
      相关资源
      最近更新 更多