【问题标题】:Omit the msvcr100.dll when developing in C/C++ for windows?用 C/C++ for windows 开发时省略 msvcr100.dll?
【发布时间】:2012-05-25 00:13:10
【问题描述】:

是否可以用 C/C++ for windows 开发而不链接 msvcr100.dll?

我知道这是 Windows 的标准 c 库,但我想知道如果我没有安装 Visual Studio 或 Redistributable 包,我计算机上的所有程序如何运行?

【问题讨论】:

  • 您可以针对英特尔或 Gcc 等其他 c++ 库进行开发,但如果您动态链接到该库并且它在运行时不可用,您的程序将无法运行。静态链接会起作用。
  • Paint 等链接的是哪个库?还是它们都与他们使用的 c lib 静态链接?
  • Paint 是针对较旧的 msvcr 开发的,并且默认情况下已安装到 windows 中。
  • 您可以使用depends.exe检查程序的动态(DLL)依赖关系
  • @史蒂夫。谢谢!是的,我的可执行文件始终依赖于 msvcrXXX。

标签: c++ c winapi visual-c++ msvcr100.dll


【解决方案1】:

在解决方案资源管理器窗口、属性、C/C++、代码生成、运行时库设置中右键单击您的项目。将其更改为 /MTd。重复发布配置,选择 /MT

您现在将链接 CRT 的静态版本,您使用的任何函数都会直接链接到您的 EXE,而不是在运行时从 msvcr100.dll 获取它们。因此,您不再需要将 DLL 与您的程序一起部署。

如果您创建自己的 DLL,请避免使用此选项。然后,这些 DLL 和 EXE 使用完全相同的 CRT 就变得很重要,因此它们都将共享相同的 CRT 状态和相同的堆。因为如果他们不这样做,那么在将需要从一块代码释放到另一块代码的 C++ 对象或指针传递时,您将遇到令人讨厌的问题。幸运的话是 AccessViolation,否则就是内存泄漏。

【讨论】:

  • 如今,令人讨厌的错误已经不那么常见了,但是拥有 20 个 DLL 和一个 CRT 副本仍然是对磁盘空间、内存和 CPU 缓存的浪费。
  • 由于某种原因,这并不总是有效。例如,如果您已经至少编译过一次项目,则不能这样链接它。
  • 这很模糊,但不要指望增量链接在您更改它时会起作用。没问题。
【解决方案2】:

如果您将项目限制为仅使用 C 编程语言/库,那么您可以 仅链接到 MSVCRT.lib,它在自 Windows XP SP3 以来的任何 Windows 版本中都完全烘焙。

这意味着,您只能链接 MSVCRT 中的标准 C 函数,而不是依赖于 MSVCR100.DLL(或任何其他 Visual Studio DLL)。顺便说一句,this technique 用于在 Microsoft 旗下开发的 CoApp 项目中,所以在你这种情况下,我认为它是一个很好的实践。

只需下载 Windows DDK 并仅链接到 $(DDKInstallPath)lib\Crt\$(DDKPlatform)\msvcrt.lib

【讨论】:

  • 谢谢。这确实非常有趣,而且是我想要的更多。
  • 这个库是一个未记录的实现细节。不过,您可能可以指望微软在未来支持它,因为许多程序错误地依赖它。但这种支持将是有限的,例如他们不会将其移植到 64 位,因为从来没有 64 位 VC6。
  • @MSalters 这完全不是真的。安装 Windows DDK 并检查自己。 DDK 确实提供了 msvcrt.lib 的 amd64、i386 和 ia64 版本。 DDK 没有死!
  • 我也为我的项目这样做 - 链接到 WDK 7.1 和 MSVCRT.DLL - github.com/malkia/ufo - 其他人这样做是 XChat-WDK - code.google.com/p/xchat-wdk
【解决方案3】:

在 Windows 上,我怀疑是否有可能创建一个不以某种方式使用 CRT 的重要程序。

可以在不链接到 msvcrXXX.dll 的情况下使用 CRT - 只需链接到静态库即可。但要解决您的问题:

如果我没有 Visual,我计算机上的所有程序如何运行 安装了 Studio 还是 Redistributable 包?

如果您 PC 上的程序链接到 msvcrtxxx.dll,那么它们不能。 Sinmply,可能在您出现之前,特定程序所需的 redist 就已经安装在您的 PC 上。或者至少是程序所需的 redist 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多