2013-09-10 40 views
5

VS2012的静态链接版本似乎存在问题。在旧系统上启动控制台应用程序会导致异常,无论何时使用流,尽管新系统根本没有问题。 要重现此错误就足够了使用Visual Studio 2012进行静态链接的msvcrt的例外

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

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

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

+0

您是否曾尝试在Windows XP的调试器下运行该应用程序以找出访问冲突发生的位置?如果您没有在Windows XP上安装Visual Studio,则可以设置[远程调试](http://msdn.microsoft.com/en-us/library/vstudio/y7f5zaaa.aspx)。 Visual Studio附带CRT实现的源代码。确保将目录添加到* VC++目录*。 – IInspectable

+0

@IInspectable:感谢远程调试的想法。我会尝试一下,但是使用VS2012和XP进行远程调试似乎并不容易:[我可以在Windows XP上使用Visual Studio 2010远程调试器从Visual Studio 2012调试.Net 4.0应用程序吗?](http:// stackoverflow .com/questions/14444055/can-i-use-the-visual-studio-2010-remote-debugger-on-windows-xp-to-debug-a-net-4) – user2766445

+0

@IInspectable:远程调试不起作用与Visual Studio 2012和Windows XP。 Visual Studio 2012远程调试器需要“更新版本的Windows”。我试图安装Visual Studio 2010远程调试器,并尝试从Visual Studio 2012进行连接 - 这不起作用。 – user2766445

回答

2

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

的Visual Studio 2012使用SSE2指令通过默认。这会给诸如不支持SSE2的Intel Pentium III或AMD Athlon XP等旧系统带来麻烦。引发无效的指令异常。 您可以使用/arch:IA32编译器选项切换SSE2。

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

相关问题