【问题标题】:Exception in statically linked msvcrt using Visual Studio 2012使用 Visual Studio 2012 的静态链接 msvcrt 中的异常
【发布时间】:2013-09-14 17:52:35
【问题描述】:

VS2012的静态链接版本好像有问题。每当使用流时,在旧系统上启动控制台应用程序都会导致异常,尽管新系统根本不会引起任何问题。 要重现此错误,足以

  • 在 VS2012 中创建一个新的控制台应用程序
  • 在主函数中添加std::ofstream f;std::cout << "Hello World";行 (根据需要包括 fstream 或 iostream)
  • 切换到 v110_xp 工具集(如果 Windows XP 需要)
  • 切换到静态链接库 (/MT)
  • 在旧系统上启动 exe 总是有例外。

删除带有 ofstream 或 cout 的行总能解决问题。 切换到动态链接的运行时库 (/MD) 始终可以解决问题。 在 ofstream 的情况下,使用大小优化 (/O1) 或不优化 (/Od) 代替速度优化 (/O2) 即可解决问题。

有人有想法或提示吗?提前致谢。

【问题讨论】:

  • 您是否尝试过在 Windows XP 上的调试器下运行该应用程序以查明发生访问冲突的位置?如果您没有在 Windows XP 上安装 Visual Studio,您可以设置 Remote Debugging。 Visual Studio 附带其 CRT 实现的源代码。确保将目录添加到 VC++ 目录
  • @IInspectable:感谢远程调试的想法。我会试试的,但是用 VS2012 和 XP 进行远程调试似乎并不容易:Can I use the Visual Studio 2010 remote debugger on Windows XP to debug a .Net 4.0 app from Visual Studio 2012?
  • @IInspectable:远程调试不适用于 Visual Studio 2012 和 Windows XP。 Visual Studio 2012 远程调试器需要“更新版本的 Windows”。我尝试安装 Visual Studio 2010 远程调试器并尝试从 Visual Studio 2012 进行连接 - 但没有成功。
  • 这基本上是我从你链接到的问题的链接中得到的。看来您需要 Visual Studio 2010 才能连接到 Windows XP 机器。虽然您可以在同一台机器上并排安装 VS 2010 和 VS 2012,但这肯定不太理想,即使您可以使用 VS 2010 调试基于 VS 2012 构建的应用程序。微软似乎完全低估了 XP 安装的数量仍在使用中。

标签: c++ visual-studio-2012 cpu-architecture msvcrt sse2


【解决方案1】:

我自己解决了——我的第一个假设是错误的:

Visual Studio 2012默认使用SSE2指令。这会导致不支持 SSE2 的旧系统(例如 Intel Pentium III 或 AMD Athlon XP)出现问题。抛出无效指令异常。 您可以使用 /arch:IA32 编译器选项切换 SSE2。

动态链接的 msvcrt (DLL) 在所有情况下都有效,因为它不受 /arch 编译器选项的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 2011-06-15
    • 2018-08-09
    相关资源
    最近更新 更多