2016-01-18 2 views
0

Так что я решил дать C++ попробовать сегодня. Я загрузил MinGw и компилятор g ++, который поставляется вместе с ним. Я решил проверить следующий код:std :: thread работает в cygwin, но не в MinGw

#include <iostream> 
#include <thread> 

int foo() 
{ 
    std::cout << "foo" << std::endl; 
} 

int main() 
{ 
    std::thread t1(foo); 
    t1.join(); 
    std::cout << "done" << std::endl; 
    return 0; 
} 

Затем я попытался скомпилировать его в командной строке, используя следующую строку:

g++ -std=c++11 main.cpp 

, который работает на привет мир. Однако на этот раз он дал мне эту ошибку:

error: 'thread' is not a member of 'std'

Я попробовал тот же код с помощью г ++ обеспечивается Cygwin, и она работает. Так почему же он не работает в MinGw? Это устарело или что-то еще? Я хочу скомпилировать материал, используя C++ 11 и C++ 14, как на терминале cygwin, но вне среды cygwin.

ответ

4

MinGW-w64 (или, скорее, GCC на окнах) необходимо скомпилировать с помощью поддержки потоков posix, если вы хотите использовать std::thread, предположительно, вы загрузили сборку с родными потоками Windows.

Ознакомьтесь с папками mingw-builds, ориентированными на 64 bit или 32 bit, и выберите версию с потоками posix. Вам также нужно будет выбрать метод обработки исключений, если у вас нет причины выбирать иначе, а затем придерживаться значений GCC по умолчанию для 64-битных и карликов для 32.

+1

У меня была эта проблема на днях ... Следующая ссылка может быть полезна в вашем ответе http://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/ mingw-builds/5.3.0/threads-posix/ – silvergasp

+1

@NathanielBrough Обычно не рекомендуется ссылаться на конкретные версии вещей в ответе SO, это может привести к загрузке старого программного обеспечения вниз по линии. – user657267

+0

@NathanielBrough Вы говорите, что это определенно тот случай, когда MinGw устарел и что, установив MinGw-64, он решит эту проблему? Кроме того, они одно и то же, или просто обновления одного анорта? – user3685285

2

Я тестировал это в linux (крест -compiling).

компилируется нормально,

i686-w64-mingw32-g++-posix -std=c++11 threads.cpp -lwinpthread 

это не

i686-w64-mingw32-g++-win32 -std=c++11 threads.cpp -lwinpthread 

Разница между компиляторами --enable-threads=win32 против --enable-threads=posix вариант используется, когда были построены компиляторы. g++ -v должен показать, что было использовано.

+0

Извините, я слишком много C++ noob, чтобы понять, что вы имеете в виду. Я использую окна. Что такое кросс-компиляция? Что мне делать, чтобы включить posix, или мне нужна машина linux? – user3685285

+0

@ user3685285 Извините, если я вас смутил. У меня просто не было компьютера Windows с подходящим вариантом для компилятора, чтобы подтвердить мои подозрения. С помощью кросс-компилятора я могу скомпилировать приложения Windows с помощью Linux-машины (правильный ответ займет слишком много времени, сообщает Google). –