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

use*_*445 5 c++ msvcrt cpu-architecture sse2 visual-studio-2012

在VS2012的静态链接版本中似乎存在问题.在旧系统上启动控制台应用程序会导致异常,无论何时使用流,尽管新系统根本不会造成任何问题.要重现此错误,就足够了

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

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

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

use*_*445 2

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

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

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