最近被一个问题折磨了好几天,VC++2008 编译出来的 Debug 版本程序,拷到目标机器上,没有办法运行。我用 VC++2008 编译的文件在自己电脑上可以运行,可一放到别人电脑上就显示程序配置有问题,试了几台电脑都这样,拿到另一台装了 VC++2008 的电脑上又正常了。以前用 VC++6.0 的时候没这么多事,这是怎么回事呢?

类似这种情况下,按理说应该是少了某个动态链接库,但是我确定第三方的动态链接库都拷贝到目标机器上了。

在目标机器上安装 Microsoft Visual C++ 2008 Redistributable Package (x86) 后,程序依然不能运行。但是如果我装给目标机器装上 VS2008 ,程序就可以顺利执行。

这个问题和 Debug 版本有关吗?还是 VS2008 的问题?编译成 Release 版本能不能解决这个问题呢?

我用静态编译的方式,编译出的 release 版本就更奇怪了,在我自己的电脑上运行,都提示如下错误:

"无法启动程序,因为计算机中丢失 MSVCP90.dll。尝试重新安装该程序以解决此问题。

这个库我怎么可能会没有?

上 MSDN 仔细找了找原因,出现类似上面的问题,有以下几点需要注意:

  1. 按道理来说,编译成 release 版本后,只要在目标机器上安装相应版本的 vc_redist 就可以了;
  2. 对于 VS2008 版本,光把编译生成的可执行文件及 Dll 拷贝到目标机器上是不行的,要加上 manifest 文件;
  3. 动态链接的程序,需要在文件目录里复制 MFC90.dll, MSVCR90.dll 和 manifest 文件,不加上这个 manifest 是运行不了滴。

在寻找答案的过程中,也在 StackOverflow 里提问获得了帮助,原文是 Where is msvcp90d.dll supposed to come from?,笔记一下以备查阅。

如果需要检测程序依赖的动态链接库有哪些,可以使用 Dependency Walker 这个工具。

PS: 看来 Stackoverflow 里,问题的回答质量是相当高的,以后可以尝试多用。