使用Visual Studio 2012静态链接msvcrt时出现异常

5
在VS2012的静态链接版本中似乎存在问题。在旧系统上启动控制台应用程序会导致异常,只要使用了流(streams),虽然新系统没有任何问题。 为了重现此错误,只需:
  • 在VS2012中创建一个新的控制台应用程序
  • 在主函数中添加行 std :: ofstream f; 或 std :: cout <<“Hello World”; (根据需要包括fstream或iostream)
  • 切换到v110_xp工具集(如果Windows XP需要)
  • 切换到静态链接库(/ MT)
  • 在旧系统上启动exe 总是有一个例外。

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

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


你尝试在Windows XP下使用调试器运行应用程序以找出访问冲突发生的位置了吗?如果你没有在Windows XP上安装Visual Studio,你可以设置远程调试。Visual Studio附带其CRT实现的源代码。确保将该目录添加到VC++目录中。 - IInspectable
@IInspectable:感谢您提供远程调试的想法。我会尝试一下,但是使用VS2012和XP进行远程调试似乎并不容易:我能否使用Visual Studio 2010远程调试器在Windows XP上从Visual Studio 2012调试.NET 4.0应用程序? - user2766445
@IInspectable:使用Visual Studio 2012和Windows XP无法进行远程调试。Visual Studio 2012远程调试器需要“更新版本的Windows”。我尝试安装Visual Studio 2010远程调试器并尝试从Visual Studio 2012连接,但没有成功。 - user2766445
这基本上是我从你提供的问题链接中得到的。看起来你需要使用Visual Studio 2010连接到Windows XP机器。虽然你可以在同一台机器上并排安装VS 2010和VS 2012,但这肯定不是最理想的选择,尽管你可以使用VS 2010调试使用VS 2012构建的应用程序。微软似乎完全低估了仍在使用XP的安装数量。 - IInspectable
1个回答

2
我自己解决了 - 我的第一个假设是错误的: Visual Studio 2012 默认使用SSE2指令,这对于不支持SSE2的旧系统,如英特尔Pentium III或AMD Athlon XP,会造成麻烦。会抛出无效指令异常。
您可以使用/arch:IA32编译器选项关闭SSE2。
动态链接的msvcrt(DLL)在所有情况下都可以工作,因为它不受/arch编译器选项的影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接