2016-01-18 18 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提供的G ++試圖完全相同的代碼,它的作品。那麼爲什麼它在MinGw中不起作用呢?它是過時的還是什麼?我想在cygwin終端上使用C++ 11和C++ 14編譯東西,但不在cygwin環境中。

回答

4

如果你想使用std::thread,MinGW-w64(或者更確切地說GCC在windows上)需要使用posix線程支持進行編譯,大概你是用本地窗口線程下載了一個版本。

查看以64 bit32 bit爲目標的mingw-builds文件夾,並選擇帶posix線程的版本。您還需要選擇異常處理方法,如果你沒有理由去選擇其它方式,然後用SEH的64位和矮的GCC默認堅持使用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,它會解決這個問題嗎?另外,他們是一樣的東西,還是隻更新一個anohter? – 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理解你的意思。我正在使用Windows。什麼是交叉編譯?我應該怎麼做才能啓用posix,還是我需要一臺linux機器? – user3685285

+0

@ user3685285對不起,如果我困惑你。我只是沒有配備正確的編譯器版本的Windows電腦來確認我的懷疑。使用交叉編譯器,我可以使用Linux機器編譯Windows應用程序(正確的答案會花費太長時間,谷歌應該告訴)。 –

相關問題