并排疯狂 - 在同一台计算机上运行二进制文件

时间:2011-01-02 12:48:19

标签: c++ side-by-side winsxs

这是我的配置:

  • 计算机A - Windows 7,MS Visual Studio 2005针对Win7兼容性修补(8.0.50727.867)
  • 计算机B - 安装了Windows XP SP2,MS Visual Studio 2005(8.0.50727.42)

我的项目有一些外部依赖项(预构建的DLL - 构建在 A 或从Internet下载),一些从源构建的DLL和一个可执行文件。我主要是在 A 上开发,一切都很好。在某些时候,我尝试在计算机 B 上构建我的项目,将预构建的DLL复制到输出文件夹。一切都很好,但尝试启动我的应用程序

  

应用程序无法正确初始化(0xc0150002)....

事件日志包含其中两个:

  

无法找到依赖程序集Microsoft.VC80.CRT而上次错误是您的系统上未安装引用的程序集。

加上稍微有趣的

  

生成激活上下文失败   some.dll。参考错误消息:   操作成功完成。

此时我正在尝试使用Google-Fu,但是徒劳无功 - 几乎所有的点击都是关于在没有 Visual Studio安装的机器上运行二进制文件。但是,在我的情况下,可执行文件无法在它们构建的计算机上运行。

下一步是尝试依赖walker,它让我更加困惑 - 我在同一个盒子上的源码构建的DLL无法找到MSVCR80.DLLMSVCP80.DLL,但是可执行文件似乎没有问题。这两个DLL,即当我用依赖walker打开可执行文件时,它显示可以找到MSVC?80.DLL,但是当我打开我的一个DLL时,它说它们不能。这就是我完全没有想法该做什么,所以我问你,亲爱的stackoverflow:)

我承认我在整个并排的事情上有点模糊,所以对这个主题的一般性阅读也将受到赞赏。

4 个答案:

答案 0 :(得分:3)

您的问题可以解决您的问题:计算机A的VC运行时版本为 8.0.50727.867 ,计算机B的版本 8.0.50727.42

您在计算机A上构建了库,它们依赖于VC运行时的版本867。 (这可以在库中嵌入的清单中找到。)当您将它们复制到计算机B时,这些库仍然需要运行时的版本867,但您只有版本42。

要解决VC运行时程序集依赖关系,必须在计算机B上安装版本为867的VC运行时可再发行组件。但是,我建议您更新计算机B上的Visual Studio,以便在两台计算机上具有相同的版本。更好的是,在两台计算机上安装Visual Studio 2005 SP1,然后安装this security update to SP1。安装后者后,您的库将取决于版本 8.0.50727.4053

答案 1 :(得分:1)

问题可能与两台机器上安装的不同版本的CRT运行时有关。是否可以构建所有模块以使用静态链接的CRT运行时来验证这一点?

答案 2 :(得分:0)

首先,我通过准备虚拟项目加载它们来检查预建的dll

答案 3 :(得分:0)

我最近在一台机器上构建项目然后将它们移动到另一台机器时遇到了同样的错误。这里最大的罪魁祸首可能是其中一个二进制组件的调试配置。也就是说,MSVC对使用相同的运行时库,调试或发布构建的所有DLL / EXE具有相当严格的要求,否则它们将不能一起工作。

当我发生这种情况时,他们也倾向于编译得很好,但是当你试图运行它们时,你会得到那个非常神秘的错误信息。

您需要确保您构建的每个模块使用相同的配置,从而在整个构建链中进行调试或发布。此错误也可能导致其他库中的不匹配,因此请确保您的MSVC与您正在构建的计算机上的版本完全相同。