C++ Visual Studio 2010 MSVCR依赖项删除?
我试过用谷歌搜索这个,但找不到解决办法。我正在努力学习一些基本的C++。我写了一个简单的hello world:C++ Visual Studio 2010 MSVCR依赖项删除?,c++,windows,visual-studio-2010,dll,dependencies,C++,Windows,Visual Studio 2010,Dll,Dependencies,我试过用谷歌搜索这个,但找不到解决办法。我正在努力学习一些基本的C++。我写了一个简单的hello world: #include <stdio.h> int main() { printf("hello, world\n"); return 0; } #包括 int main() { printf(“你好,世界”\n); 返回0; } 它编译得非常完美,一切都很完美!我觉得很好,所以我在虚拟机上安装了XP,但没有安装服务包,然后试着运行它。它告诉我我需要MSVC
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
#包括
int main()
{
printf(“你好,世界”\n);
返回0;
}
它编译得非常完美,一切都很完美!我觉得很好,所以我在虚拟机上安装了XP,但没有安装服务包,然后试着运行它。它告诉我我需要MSVCR dll。有什么方法可以完全消除这种依赖关系吗?我不想用dll填充程序。我希望它完全消失。是否有可能制作并运行一个将在XP及更高版本中运行的程序?谢谢。您可以静态链接MS运行时,项目选项->C/C++->代码生成->多线程(或用于调试配置的多线程调试)。那时不需要DLL。 < P>在C中,技术上可以删除这个依赖关系,但我不确定C++中是否有可能。无论哪种情况,我都不推荐它。你失去了很多CRT在幕后为你做的事情,其中大部分你不想以一种低劣的方式重塑自己。对于初学者来说,运行库实际上是调用您的代码>主< /代码>函数,以及调用全局和静态C++对象的构造函数和析构函数。 最好、最简单的解决方案可能是更改应用程序链接到运行库的方式。您有两种不同的选择:动态和静态。动态链接的内存效率更高,这意味着您的应用程序将利用对库进行的任何错误修复。它依赖于应用程序启动时存在的运行时DLL。静态链接实际上是在构建的链接阶段将运行时库代码嵌入到应用程序中。这意味着您可以在不分发DLL的情况下运行,但有一些重要的注意事项 对于简单的应用程序,这些警告不太可能是相关的。更改项目选项中正在使用的链接样式:
调试版本应使用“多线程调试”,而发布版本应使用“多线程”
\Program Files\Visual Studio x.0\VC\redist\
当然,CRT的调试版本永远不会再发行。因为您不应该分发应用程序的调试版本,所以这不是问题。确保您已经编译了一个“Release”构建(使用顶部工具栏中的下拉组合框),对于该构建,您将只需要在上面的目录中找到的可再发行库
我不能使用XP附带的运行时吗
任何版本的Windows都没有可供您使用的C运行时。Windows本身确实依赖于C运行时库,但它部署了该库的私有版本供自己使用。应用程序无意链接到它或以任何方式使用它。您可以自行部署所有必要的依赖项,正如您所注意到的,您不能假设目标计算机已经安装了正确的版本。您可以删除恼人的运行时库,请执行以下操作:
项目属性>链接器>输入>忽略所有默认库>是
这将为您提供一些需要处理的问题,例如,浮动
点数不起作用,堆栈内存非常小(约3k),没有内置的帮助来防止缓冲区溢出等,如果不在项目中复制粘贴标准库,则无法使用标准库
这也将减少.exe的大小,几乎相当于它是手工制作的
在汇编程序中,不能避免C++运行时。它正是调用main()
函数的东西。@Cody Gray:编译的可执行文件大小,没有依赖项int main(){return 0;}
将生成16kB的可执行文件,可压缩为2..6kB,唯一的依赖项是msvcrt.dll,它是系统组件。您甚至可以摆脱这种依赖性,制作自己的精简crt(依赖于GlobalAlloc或VirtualAlloc等系统功能,并使用_tmaincrtstartup),这将更小,但在这种情况下,它将得到更多的编译。当然,所有这些技巧只有在您的应用程序有非常独特的要求时才有用(可能是有大小限制的demoscene竞赛?。@Cody msvcrt.dll是MSVC6运行时,从Win2k开始随Windows提供。使用起来非常好。说您不应该链接到系统提供的DLL是很奇怪的。你是在建议我们停止链接到user32.dll等吗?@David:这不是MSVC6运行时,它只是同名而已。实际上,Microsoft一直在更新Windows系统组件的运行时库,添加了一些新功能,这些功能以版本名称部署。我记不起我在哪里读过它,但我有一个相对可靠的权威,这是一个供Windows内部使用的私有库,不可供应用程序使用。该理论至少得到了以下事实的支持:它的.lib文件没有公开。链接到专用CRT不同于user32.dll。这是我能找到的最好的链接