运行没有运行时可再发行组件的C ++二进制文件(Server 2k3,XP SP3)

时间:2009-10-17 00:58:53

标签: c++ windows windows-xp runtime

在Visual Studio 2008中编写了CGI应用程序并在本地对其进行了删除后,我将其上传到Windows Server 2003操作系统,并立即无法运行。

我猜我需要安装可怜的Runtime distributable,但在阅读之后:

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,string?

如果添加windows.h,它会发生重大变化吗?

添加了:

使用下面推荐的/ MT开关

C / C ++ - >代码生成 - >运行时库 - >多线程(/ MT)

(你可能需要做一个干净的事情:

构建 - >清洁

以避免错误消息

“无法将更新后的清单保存到文件中”)

将我的应用程序从38k增加到573k。这就是我所谓的重要(想象一下,如果这是你的薪水)。由于这个应用程序的许多实例将不断加载和卸载(需要宝贵的内存和处理器资源),我想找到一个更好(更小)的解决方案。

我知道这对于今天的许多情况并不重要,而不是许多开发人员关注的焦点,因此趋势为.NOT和60MB运行时,但这就是我想要做的。

添加了:

删除调试以使项目编译后:

项目 - > Propeties - > 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。这是可以接受的

2 个答案:

答案 0 :(得分:10)

让我修改一下我的答案:

您有几个选择:

1)安装VC ++ 2008运行时。你可以download和安装程序。它们的合并模块也可用。

2)静态链接运行时(/ MT或C / C ++ - >代码生成 - >运行时库:多线程)。这将增加可执行文件的大小,但它不依赖于任何Dll。如果您担心大小,请仅使用C标准库或仅直接使用Windows API。

3)使用旧版VC ++。 2005及更早版本不需要安装运行时。 Dll可以放在与可执行文件相同的目录中。如果您使用VC ++ 6.0,则运行时将安装在所有版本的Windows上,否则您需要自己安装。

答案 1 :(得分:8)

更全面的选项列表:

  • 重写应用程序,以便根本不使用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添加到您的项目中定义,重建并且应该自行排序。
  • 显然可以为VS9获取vc_redist.exe。找到或计算实际安装上述程序集(作为Microsoft.VC90.CRT的内容)到共享sxs存储中所需的MSI或安装程序mojo。