【问题标题】:Unable to start executable built in VS2008 in a clean system无法在干净的系统中启动内置于 VS2008 的可执行文件
【发布时间】:2013-06-04 15:13:13
【问题描述】:

我最近遇到了这个问题。我在 Visual Studio 2008 中有一个简单的基于控制台的项目,我在发布模式下构建并发布了它。

我们发现在干净的 windows xp sp3 机器上,双击可执行文件并没有启动,并抛出一个错误,提示“配置不正确”。我们通过在系统上安装 VS2008 可再发行包解决了这个问题。我的问题是:

1- 为什么会这样?它并没有发生在所有 xp 机器上,但其中一些机器上发生了。令人难以置信的是,运行简单的 win32 程序所需的文件在 windows xp sp3 中默认不存在。那么notepad.exe和其他程序在哪里运行呢?我考虑的一种可能性可能是操作系统中存在的运行时文件较旧,而 exe 清单指的是较新版本的文件。但我想知道是否是这种情况,因为 VS 2008 本身已经很老了。让我知道你的想法。

2- 由于我必须在很多机器上运行 exe,我正在考虑一种方法,通过 VS 2008 中的 win32 程序静态链接所有需要的库。我知道链接器选项中的 /MT 开关,但想知道它是否会处理所有运行时库(C++ 库和其他 Windows 库)。

谢谢。

【问题讨论】:

  • 听起来目标系统上没有安装 Visual C(可再发行)运行时库。我自己遇到并解决了这个问题,但记不住正确答案。我相信很快会有其他人想出一个。
  • 感谢 Adrian 的回复,不确定是否有回复,但实际上有人为这个问题对我进行了 -1 分,而没有发表任何评论。太好了!
  • 我认为没有理由反对,所以取消它。

标签: visual-studio winapi win32-process


【解决方案1】:
  1. 发生这种情况是因为 VS2008 可再发行组件未随 Windows 一起安装。它们必须由另一个应用程序安装,这意味着它们不会出现在原始 Windows 安装中。但它们很可能出现在安装了一些应用程序的机器上,因为许多 Windows 应用程序都使用它们。记事本等原生 Windows 应用程序不依赖它们,因此记事本在没有它们的情况下运行也就不足为奇了。

  2. 正如 typ1232 已经指出的那样,/MT 选项将解决您的问题(以增加 EXE 和 DLL 大小为代价)。本机 Windows API 的库保证存在,除非它们被明确记录为您必须单独安装的选项,因此您无需担心它们。

正如您现在所发现的,在原始 Windows 安装上以发布模式测试应用程序是测试任何 Windows 应用程序的关键步骤。

【讨论】:

  • 请注意,记事本和其他 Windows 程序仍然依赖于 C 运行时。它使用“msvcrt.dll”(Windows NT CRT DLL)。这是possible,但不推荐/不支持动态链接这些!
【解决方案2】:

/MT 选项将导致运行时库被静态链接,因此动态库不必存在于目标系统上。

另一种方法是将 redist 安装程序与您的安装程序打包在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多