【问题标题】:VS2008 C++ app fails to start in Debug mode: This application has failed to start because MSVCR90.dll was not foundVS2008 C++ 应用程序无法在调试模式下启动:此应用程序无法启动,因为未找到 MSVCR90.dll
【发布时间】:2009-06-05 16:22:07
【问题描述】:

我刚刚创建了一个最小的应用程序,在 Vista x64 上使用 VS 2008 SP1。它是一个控制台应用程序,使用向导创建,没有 MFC 或任何东西,我正在用 64 位构建它。

当我在开发框上运行调试 exe 时,在 Visual Studio 2008 中按 F5,我收到此错误:

TestApp.exe - Unable To Locate Component

This application has failed to start because MSVCR90.dll was not found. 
Re-installing the application may fix this problem. 

OK   

我在运行 release exe 时没有收到此错误,它按预期工作。

当我在 iostream 和 fstream 上添加了一些 include 依赖项并开始调用一些 winsock API 调用时,这个问题就开始了。

有什么建议吗?

更新:我将 msvcr90.dll(不是 msvcrd90.dll)复制到了正确的文件夹中,现在我得到了一个不同的错误:


Microsoft Visual C++ 运行时库

运行时错误!

程序:[snip]...

R6034

应用程序试图错误地加载 C 运行时库。 请联系应用程序的支持团队了解更多信息。


好的

  • 亚历克斯

【问题讨论】:

  • 这与MFC无关。这是 C++ 标准库。
  • 是什么让你认为它与 MFC 有关系?
  • 是它在这个环境下的第一个项目吗?
  • 我不太清楚你的意思。它不是我在这个盒子上用 VS2008 构建的第一个 C++ 应用程序。

标签: c++ visual-studio-2008 64-bit


【解决方案1】:

您的应用程序正在使用 DLL CRT 运行时。您要在其上运行它的机器需要安装调试 CRT 运行时 dll(这很麻烦……)。我认为更好的解决方案是更改编译选项以使用静态链接 CRT 运行时(这意味着运行时链接到您的应用程序而不是使用 DLL 版本)。

在 Visual Studio 中进入项目的属性,然后选择配置属性/C++/代码生成并将“运行时库”从“多线程调试 dll”更改为“多线程调试”。

您可能也希望对发布版本执行相同的操作,因为某些版本的操作系统不会预安装 V9 发布 CRT 库,或者您可以将 v9 发布 crt dll 作为安装的一部分。

【讨论】:

  • 嗨,谢谢你的想法。我要运行它的机器是我的开发框,我在 IDE 中按 F5 运行它。我将“运行时库”更改为“多线程调试”,它不再链接,我收到大约 7 个错误,例如:错误 13 错误 LNK2005:memmove 已在 LIBCMTD.lib(memcpy.obj) MSVCRT.lib DataEngineSocketsAPI 中定义跨度>
【解决方案2】:

您是如何运行发布 exe(IDE 中的 Ctrl+F5)的?您应该将运行时库设置为与设置发布 exe 相同的内容。

【讨论】:

  • Ctrl+F5 或 F5。用于发布的运行时库设置为“多线程 DLL (/MD)”,用于调试的运行库设置为“多线程调试 DLL (/MDd)”
【解决方案3】:

您是否将调试模式程序链接到发布模式库?您在评论中提到了这个错误:

Error 13 error LNK2005: memmove already defined in LIBCMTD.lib(memcpy.obj) MSVCRT.lib DataEngineSocketsAPI

在我看来,您有一个名为 DataEngineSocketsAPI 的库,它链接到定义 memmove() 的 MSVCRT.lib。但是,您的 exe 链接到 libcmtd.lib,它还定义了 memmove() 的不同(调试模式)版本。

第三方(例如您自己的)库也必须具有调试和发布版本,并且您必须使用适合您构建 exe 的模式的版本。

【讨论】:

  • 我只有一个项目,它是一个 exe,不涉及 dll 或库。只是一件事情。也许 DEBUG 项目配置设置不正确。
  • 那么,DataEngineSocketsAPI 引用从何而来?
【解决方案4】:

Debug exe 链接到调试运行时库 MSVCR90D.dll 的头文件。您需要确保 dll 在路径中。正如 Shane 所说,静态链接是一个可行的选择,但典型的解决方案是使用 exe 部署依赖的 dll。静态链接所有内容会导致 exe 臃肿和运行时库的大量重复副本。

看到您的编辑,问题肯定是 msvcr90d.dll,但它需要正确部署在 WinSXS 文件夹中。您可能能够重新安装 VS 2008 的服务包并重新部署它。

【讨论】:

  • 嗨罗伯特,鉴于我使用的是 VS2008,MSVCR90D.dll 不应该已经在路径中了吗?
  • 确保路径在工具->选项->项目和解决方案->VC++目录中。
  • 搜索我的电脑,我在以下位置找到它: 1. C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ce\dll[architecture](例如 armvi、x86 等) 2. C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist[architecture]\Microsoft.VC90.DebugCRT 3. 文件夹如:C:\Windows\winsxs\amd64_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.21022 .8_none_4ec74c6b3093419c
  • djeidot:我应该指向哪个目录? (请参阅我之前评论中的选择。我将其添加到哪组目录?包括?不。库?不......?
  • 它抱怨的是“MSVCR90.dll”而不是“MSVCR90D.dll”......即使我正在做一个调试版本。
【解决方案5】:

再次感谢您提供的所有帮助。事实证明我只是犯了一个错误,并没有注意到我正在使用的库静态链接到不同版本的 MSVC 运行时。这导致了问题的结束。

【讨论】:

    【解决方案6】:

    查看此链接

    http://www.insidercoding.com/post/2008/07/21/Debugging-issues-with-MSVCR90DLL.aspx

    您需要(仅适用于调试模式)忽略链接输入选项卡 MSVCRT; MSVCR90;因为您想使用 CRT 的调试版本。

    【讨论】:

      【解决方案7】:

      我可以确认这个问题:让 Visual Studio 2008 创建项目(Visual C++/Win32 控制台应用程序) 然后按 F5 将显示该错误。

      有一个简单的解决方案:

      关闭增量链接。 HOWTO:打开属性页面 为项目。设置配置 属性/链接器/常规/启用增量链接到“否 (增量:否)”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-16
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多