std::endl приводит к сбою Windows 8, скомпилированному с использованием MinGW
У меня есть 3 компьютера, два из которых используют Windows 8. Используя последнюю версию MinGW g++ (4.8.1-4), моя программа hello world зависает всякий раз, когда я компилирую и запускаю на компьютерах с Windows 8, но не в Windows 7.
#include <iostream>
int main()
{
std::cout << "Hello, World!" <<std::endl;
return 0;
}
Это прекрасно компилируется в g ++, но при запуске a.exe отобразится "Hello, World!" затем появится окно с сообщением "a.exe перестал работать, Windows может проверить в Интернете решение проблемы с программой...." и т. д.
Кто-нибудь видел эту проблему.
Также я попробовал "std::cout <<" Hello, World! \ N "<< std:: flush;" и это имеет ту же проблему. Кажется, что каждая функция, которая очищает буфер, вызывает сбой.
Следуя совету Эрика, я перекомпилировал программу, запустил ее в gdb и получил следующий вывод:
Program received signal SIGILL, Illegal instruction.
0x00405065 in _Jv_RegisterClasses ()
2 ответа
Во втором случае '\n' должен вызывать сброс выходных данных в любом случае, хотя в Windows я считаю, что вывод на консоль немедленный (или, возможно, автоматический после короткого времени ожидания) в любом случае без явного сброса.
Я предлагаю следующие эксперименты:
1) Посмотрите, является ли она специфичной для библиотеки C++ с использованием библиотеки C (в MinGW Microsoft использует среду выполнения C вместо glibc):
#include <stdio.h>
int main()
{
printf( "Hello, World!\n" ) ;
return 0;
}
2) устранить код выхода путем:
int main()
{
return 0;
}
3) Нет новой строки вообще:
#include <iostream>
int main()
{
std::cout << "Hello, World! ;
return 0;
}
4) Попробуйте разные варианты компилятора, такие как уровни оптимизации или -fno-builtin
например, или как предложено здесь: -static-libgcc -static-libstdc++
(хотя я сомневаюсь, что `-static-libgcc` сам по себе будет иметь какой-либо эффект, так как MinGW использует библиотеку DLL времени выполнения C от Microsoft, а статическая библиотека доступна только с инструментами Microsoft).
У меня возникла та же проблема, и я обнаружил, что после долгих мучительных поисков у меня на компьютере было несколько версий mingw, предоставленных libstdC++-6.dll. Один был частью установки mingw, другие были частью других установочных пакетов (gnuplot и GIMP). Поскольку у меня был gnuplot в моем PATH, скомпилированный mingw exe, он использовал бы более старую несовместимую версию этой dll и падал с описанными симптомами. Поэтому я могу подтвердить подозрение Дитмара Кюля. Как предложено выше, статическая компоновка библиотеки, очевидно, помогает в этом случае, так как функции библиотеки включаются в exe во время компиляции.