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

3
以下是我的配置:
  • 电脑A - Windows 7, MS Visual Studio 2005(8.0.50727.867)修补程序,以兼容Win7
  • 电脑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的计算机上运行二进制文件。然而,在我的情况下,可执行文件无法在构建它们的计算机上运行。
下一步是尝试使用依赖项查看器,但这让我更加困惑 - 在同一台计算机上从源代码构建的DLL找不到MSVCR80.DLL和MSVCP80.DLL,但是可执行文件似乎与这两个DLL没有问题,即当我使用依赖项查看器打开可执行文件时,它显示可以找到MSVC?80.DLL,但是当我打开其中一个DLL时,它说找不到它们。这就是我完全不知道该怎么做的地方,所以我向你求助,亲爱的stackoverflow :)
我承认我对整个并排放置的事情有点模糊,因此也欢迎阅读有关此主题的通用信息。

1
答案就在你的问题中,注意版本号不匹配。你需要更新B。 - Hans Passant
4个回答

3
您的问题已经有了答案:计算机A拥有VC运行时版本8.0.50727.867,而计算机B只有版本8.0.50727.42
您在计算机A上构建了库,并且它们依赖于版本867的VC运行时(可以在嵌入在库中的清单中找到)。当您将它们复制到计算机B时,这些库仍然需要运行时版本867,但您只有版本42。
为解决VC运行时程序集依赖关系,您需要在计算机B上安装版本867的VC运行时可再发行包。但是,我建议您更新计算机B上的Visual Studio,以使两台计算机上的版本相同。更好的方法是,在两台计算机上安装Visual Studio 2005 SP1,然后安装此安全更新程序至SP1。安装后,您的库将依赖于版本8.0.50727.4053

1

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


需要注意的是,如果@sbk采取这种方法,他必须准备好在CRT发布安全修补程序时提供更新的位。虽然这不一定是坏事,但可能值得一提。 :) - paulcam

0

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


0

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

当我遇到这种情况时,它们似乎也可以编译得很好,但是当你尝试运行它们时,你会得到那个极其难懂的错误信息。

您需要确保您构建的每个模块都使用相同的配置,因此整个构建链路都是调试版或发布版。这个错误也可能出现在其他库不匹配的情况下,因此请确保您的MSVC在构建的机器上是完全相同的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接