c++ - 使用 Visual Studio 2012 的静态链接 msvcrt 中的异常

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

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

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

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

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

最佳答案

由我自己解决 - 我的第一个假设是错误的:

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

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

关于c++ - 使用 Visual Studio 2012 的静态链接 msvcrt 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18728774/

相关文章:

c# - 如何在 visual studio 2012 中生成 c# 文档到 chm 或 html 文件?

c# - 将 .net 类库移植到 Windows 应用商店应用程序类库

c - CPU缓存对速度的影响

c - 学习所需的环境设置 "*Computer Systems:A Programmer' s Perspective*"

x86 - 指令顺序可以发生跨函数调用吗?

c++ - c++中内存的使用

c++ - select() 和 FD_ISSET() 成功后 read() 失败

c++ - 复制抽象基类的对象

c++ - 什么时候使用新关键字?

visual-studio-2012 - Visual Studio 2012 上的 SSDT 损坏然后修复,再次损坏在 VS2013 上也损坏