运行没有运行时可再发行组件的 C++ 二进制文件(Server 2k3、XP SP3)
Posted
技术标签:
【中文标题】运行没有运行时可再发行组件的 C++ 二进制文件(Server 2k3、XP SP3)【英文标题】:Running C++ binaries without the runtime redistributable (Server2k3, XPSP3) 【发布时间】: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++ 运行时所做的)。在这种情况下我不能这样做。 【参考方案1】:让我修改一下我的答案:
你有几个选择:
1) 安装 VC++2008 运行时。您可以download 和他们的安装程序。它们的合并模块也可用。
2) 静态链接到运行时(/MT 或 C/C++ -> 代码生成 -> 运行时库:多线程)。这将增加可执行文件的大小,但它不依赖于任何 Dll。如果担心大小,只能使用 C 标准库或直接使用 Windows API。
3) 使用旧版本的 VC++。 2005 及更早版本不需要安装运行时。 Dll 可以放在与可执行文件相同的目录中。如果使用VC++6.0,所有版本的windows都会安装runtime,否则需要自己安装。
【讨论】:
我想你的意思是项目属性 -> C / C++ -> Cod Generation -> 运行时库 -> 多线程(/MT) 编码器还是鳕鱼?哈哈..你可能是对的,我试着从记忆中做。 项目属性 -> C/C++ -> 代码生成 -> 运行时库 -> DROPDOWN -> 多线程 (/MT)【参考方案2】:更完整的选项列表:
重写应用程序,使其完全不使用 C/C++。 切换到 Visual Studio 6 或基于 mingw 的工具集,例如 Code::Blocks - 它们使用已分发的 msvcrt.dll 作为其运行时。 使用 /MT 开关构建。这会将必要的运行时函数构建到您的 exe 中。这会使它膨胀。但这种膨胀(坦率地说)比加载单独的 dll 的开销要小。 将 VS9 运行时分发为“私有 sxs”安装。这需要将C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT
的内容复制到与应用程序的exe 相同的文件夹中。如果您已应用 SP1,则此文件夹将包含 SP1 运行时,但您的应用程序将要求 RTM 运行时(见图)。将_BIND_TO_CURRENT_CRT_VERSION
添加到您的项目定义、重建中,这应该会自行解决。
显然有一个 vc_redist.exe 可以为 VS9 获取。找出或找出将上述程序集(即 Microsoft.VC90.CRT 的内容)实际安装到共享 sxs 商店所需的 MSI 或安装程序 mojo。
【讨论】:
以上是关于运行没有运行时可再发行组件的 C++ 二进制文件(Server 2k3、XP SP3)的主要内容,如果未能解决你的问题,请参考以下文章
安装 msvcr90.dll 的简单方法! (没有 C++ 可再发行包)