在使用C / C ++ for windows进行开发时,省略msvcr100.dll?

是否有可能在Windows的C / C ++中开发而不是与msvcr100.dll链接?

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

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

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

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

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

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

简单地说,下载Windows DDK并仅链接到$(DDKInstallPath)lib\Crt\$(DDKPlatform)\msvcrt.lib

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

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

如果我没有安装Visual Studio或Redistributable软件包,我的计算机上的所有程序都可以运行?

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