Исключение в статически связанном msvcrt с использованием Visual Studio 2012

Кажется, есть проблема в статически связанной версии VS2012. Запуск консольного приложения в старой системе приводит к исключению всякий раз, когда используются потоки, хотя новые системы не вызывают никаких проблем.
Чтобы воспроизвести эту ошибку, достаточно

  • создать новое консольное приложение в VS2012
  • добавить строку std::ofstream f; или же std::cout << "Hello World"; в основной функции
    (включите fstream или iostream как требуется)
  • переключиться на набор инструментов v110_xp (если требуется для Windows XP)
  • переключиться на статически связанные библиотеки (/ MT)
  • запустить exe на старой системе
    Всегда есть исключение.

Удаление строки с ofstream или cout всегда решает проблему.
Переключение на динамически связанные библиотеки времени выполнения (/ MD) всегда решает проблему.
В случае использования потока, оптимизация по размеру (/ O1) или отсутствие оптимизации (/ Od) вместо оптимизации по скорости (/ O2) решили проблему.

У кого-нибудь есть идея или подсказка? Заранее спасибо.

5

Решение

Решил сам — мое первое предположение было неверным:

Visual Studio 2012 использования SSE2 инструкции по умолчанию. Это вызывает проблемы на старых системах, таких как Intel Pentium III или AMD Athlon XP, которые не поддерживают SSE2. Недопустимое исключение инструкции выдается.
Вы можете переключить SSE2, используя /arch:IA32 опция компилятора.

Динамически связанная msvcrt (DLL) работает во всех случаях, так как на нее не влияют /arch опция компилятора.

2

Другие решения

Других решений пока нет …