在64位计算机上使用Visual Studio编译32位应用程序

5
我正在尝试在64位机器上使用Visual Studio 2010编译一个简单的32位C语言Hello World应用程序,该机器运行着全新安装的Windows 7操作系统。在安装了Visual Studio后,我还安装了“Windows 7和.NET Framework 4的Windows SDK”。我选择“Win32”平台来构建应用程序。它可以在Windows 7上运行,但是如果我在运行Windows XP Professional(也是全新安装,没有软件和服务包)的32位机器上运行该应用程序,则似乎无法正常工作,出现以下错误:
"This application has failed to start because msvcr100.dll was not found"

如果有用的话,Dependency Walker会检测出2个错误(详见链接图片):
"Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module."
"Error: Modules with different CPU types were found."

http://img820.imageshack.us/img820/4725/errordp.png(图片)

请问该如何解决?谢谢!

4个回答

3

运行该程序的机器需要运行库。请参阅此MSDN信息


2
问题在于编译程序所使用的C运行时在Windows XP机器上缺失。Visual Studio 2010默认使用10.0(msvcr100.dll)运行时,而XP默认情况下不支持。您需要手动在计算机上部署C运行时,以使程序运行。

您可能想阅读以下MSDN文章,该文章讨论了使用Visual Studio 2010构建的C应用程序部署时遇到的问题。

还可能存在其他32位/64位问题,但这似乎是主要问题。


2
不要相信 Dependency Walker 上的信息……它明确显示你的 exe 是 32 位的。你的问题在于 VC 可再发行组件,即 CRT dlls - 在你的 VS 安装中查找 vcredist_x86.exe。在运行应用程序之前,你应该先运行它。
另一个选择是静态链接 CRT。参见 /MT 选项。这会使你的 exe 更大,但可以避免使用 vcredist。

我设置了/MT选项,但这次出现了“在动态链接库kernel32.dll中找不到过程入口点decodepointer”的错误,为什么? - mt22
@Lorenzo,DecodePointer从XP SP2开始支持。使用/MT编译只能让你更进一步,到达这个阶段就是你的问题了...动态链接会导致相同的问题。要么编译为基本版本的XP,要么升级XP。 - Eran
好的,谢谢@eran,还有一个小问题:为什么在这种情况下我不必信任Dependency Walker?那些错误是什么意思? - mt22
@Lorenzo,依赖项查看器可以正确获取依赖项,但由于某些原因,有时会获取错误的位数。不知道为什么会这样,但这是一个相当古老的工具(虽然仍然非常有用),而且似乎现在已经不再维护了... - Eran

1

有关运行时库的答案是正确的。另一个可能的解决方案是链接到静态运行时库而不是DLL版本。这样,您可以构建一个可执行文件,在任何机器上都可以轻松部署。

这是一种权衡,但是如果不了解您的情况,考虑这个方法也许值得。


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