2013-12-16 3 views
9

У меня есть 3 компьютера, два из которых используют Windows 8. Используя последнюю версию g ++ (4.8.1-4) MinGW, моя приветственная программа мира зависает всякий раз, когда я компилирую и запускаю на компьютерах Windows, 8, но не в Windows, 7.std :: endl сбой Windows 8, скомпилированный с использованием MinGW

#include <iostream> 
int main() 
{ 
    std::cout << "Hello, World!" <<std::endl; 
    return 0; 
} 

Это компилируется нормально в г ++, но работает a.exe будет отображать "Hello, World!" то появится окно и скажет: «a.exe перестала работать, Windows может проверить онлайн для решения программы ....» и т. д.

Кто-нибудь видел эту проблему.

Кроме того, я попробовал «std :: cout < <« Привет, мир! \ N »< < std :: flush;" и это имеет ту же проблему. Кажется, что каждая функция, которая сбрасывает буфер, вызывает сбой.

Следуя совету Эрика, я перекомпилировать программу и запустил его в GDB и получил следующий результат:

Program received signal SIGILL, Illegal instruction. 
0x00405065 in _Jv_RegisterClasses() 
+7

Попробуйте запустить под отладчиком; он, по крайней мере, скажет вам, где произошел сбой. –

+0

ОК, я запустил gdb, и он говорит: «Программный сигнал SIGILL, нелегальная инструкция. 0x00405065 в _Jv_RegisterClasses()« – user1276560

+2

Я думаю, что наиболее вероятная причина заключается в том, что стандартная библиотека C++ скомпилирована с несовместимой версией некоторого времени выполнения загруженную библиотеку, наиболее похожую на некоторую фундаментальную библиотеку. –

ответ

6

В втором случае, «\ п» должно привести к выходной флеш в любом случае, хотя в Windows я считаю, что вывод консоли немедленный (или, возможно, автоматический после короткого тайм-аута) в любом случае без явного флеша.

Я предлагаю следующие эксперименты:

1) Смотрите, если он специфичен для библиотеки C++ с использованием библиотеки C (в C выполнения MinGW от Microsoft используется вместо 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, например, или, как предложил here: -static-libgcc -static-libstdc++ (хотя я сомневаюсь, что `` -static-libgcc` сама будет иметь никакого эффекта, поскольку MinGW использует C во время выполнения DLL Microsoft и статическая библиотека доступна только с инструментами Microsoft).

+2

Это сработало. вы были правы относительно флага -static-libgcc, не помогающего; только флаг -static-libstdC++ смог решить проблему. Кроме того, -fno-builtin также не исправил его. Я довольно опытный программист на python, но, очевидно, сейчас изучаю C++. Не могли бы вы догадаться, что именно этот флаг компилятора сделал для решения моей проблемы? – user1276560

+2

@ user1276560: Без '-static-libstdC++' стандартная библиотека C++ будет предоставляться * Динамической библиотекой ссылок *, а не статически связанной библиотекой. По-видимому, существует некоторая несовместимость в сборке MinGW этой библиотеки, которая не существует в сборке статической библиотеки. Вы можете обнаружить, что в результате ваш исполняемый файл немного больше, но с положительной стороны он будет перераспределяться без необходимости распространения DLL с ним. – Clifford

+0

в моем случае, если я использую указатели типа 'char * str', чтобы получить строку от пользователя, а затем проблему с сбоем, иначе размер массива будет исправлен, а затем будет работать нормально. вы можете помочь мне с этим. – viveksinghggits

0

У меня была такая же проблема, и после долгого мучительного поиска я обнаружил, что у меня было несколько версий mingw, предоставляемых libstdC++ - 6.dll на моем компьютере. Один из них был частью установки mingw, остальные были частью других установочных пакетов (gnuplot и GIMP). Поскольку у меня был gnuplot в моей PATH, скомпилированный mingw exe, он использовал бы более старую, несовместимую версию этой DLL и аварийную ситуацию с описанными симптомами. Поэтому я могу подтвердить подозрение Дитмара Кюля. Как было сказано выше, связывание библиотеки статически очевидно помогает в этом случае, поскольку библиотечные функции включены в exe во время компиляции.

+0

Это не ответ. Вопрос был дан 3 года назад, так почему вы опубликовали ответ, который, как вы знаете, не решает проблему? –

Смежные вопросы