【发布时间】:2010-12-07 13:20:43
【问题描述】:
在 Visual Studio 2008 中编写了一个 CGI 应用程序并在本地调试后,我将它上传到 Windows Server 2003 操作系统,但它立即无法运行。
我猜我需要安装可怜的 Runtime 发行版,但是在阅读了这个之后:
http://kobyk.wordpress.com/2007/07/20/dynamically-linking-with-msvcrtdll-using-visual-c-2005/
我想知道忽略这些并排的东西并重新编写应用程序是否更有意义。
我猜 Windows Server 2003 没有我需要的 MSCRVT 版本? Windows Server 2003 有吗?
在部署胖客户端时,我想将所需的 dll 与我的应用一起分发。 他们假设我只包含 iostream、sstream、字符串是什么?
如果我添加 windows.h 会显着改变吗?
添加:
使用下面推荐的 /MT 开关
C / C++ -> 代码生成 -> 运行时库 -> 多线程(/MT)
(您可能需要进行清理:
构建 -> 清理
为了避免错误提示
“未能将更新的清单保存到文件”)
我的应用程序从 38k 膨胀到 573k。这就是我所说的重要(想象一下,如果那是你的薪水)。由于此应用程序的许多实例将不断加载和卸载(需要宝贵的内存和处理器资源),我想找到一个更好(更小)的解决方案。
我知道这对于当今的许多情况并不重要,也不是许多开发人员关注的重点,因此趋势是 .NOT 和 60MB 运行时,但这是我想做的。
添加:
去掉调试后得到工程编译:
项目 -> 属性 -> c/c++ -> 预处理器 -> 预处理器定义(删除 DEBUG;)
大小减少到 300k,它将运行。
添加: 正如下面 Chris Becke 所建议的,复制: msvcm90.dll msvcp90.dll msvcr90.dll Microsoft.VC90.CRT.manifest 应用程序的目录将提供所有需要的运行时。
多次建议使用 Visual Studio 6,但它不支持 Vista(或我们假设的 Windows 7) 其他不需要运行时可分发的解决方案可能是我的 MASM 甚至是 Basic 的味道。不幸的是,这违背了使用像 C++ 这样的高级 OOP 语言的目的。
只要我确实需要安装 C++ 可再发行组件,代价就是额外的 260k。可以接受
【问题讨论】:
-
what 有显着变化吗?几乎所有使用 VS2008 构建的东西都需要运行时安装。
-
无论如何,您几乎都将需要运行时。您的选择在于如何包含它。最方便的方法是使用静态链接版本。然后您根本不必分发单独的 dll。如果做不到这一点,您就有 50 万种方式来分发 dll。从需要阅读 15 页文档的超级复杂的并排的事情,到只需将其放在应用程序根文件夹中具有正确名称的文件夹中,这非常易于管理。
-
我不确定这会有多有效,但请尝试使用编译器/链接器选项。有一些影响了可执行文件的大小(关于优化大小和删除未使用的东西)。
-
添加 /MT 会导致 C 和 C++ 运行时静态链接而不是动态链接,因此会增加大小。不确定这是否真的有区别,因为在这两种情况下,运行时仍然需要加载到您的进程地址空间中。为什么现在不运行了?你得到什么错误信息?尝试使用depends.exe 加载它,看看它在寻找什么Dll。
-
见上文。它正在寻找一些需要并排安装的 MSVCRT 版本(这就是 C++ 运行时所做的)。在这种情况下我不能这样做。
标签: c++ windows windows-xp runtime