C++11, GCC 4.8.1和Code::Blocks线程问题使人头痛不已。

3

--编辑 如果您想使用MinGW GCC 8.4.1和线程/互斥锁/期货/原子,请不要下载Win32 threader版本,而是下载Posix版本。 --编辑

我的MinGW安装如下: x32-4.8.1-release-win32(作为线程器)-sjlj rev 5

我已经解压并正确确认MinGW GCC 4.8.1(修订版5)已安装在C:\ MinGW \ mingw32中。 我已经设置Code Blocks以查找正确路径中的最新编译器(我确定这一点)。 我可以使用#include iostream编译正常程序。 现在,当我尝试运行使用#include thread的程序时,它会给出“错误:'thread'不是'std'的成员”。

现在这是我做过和尝试过的:

我正在cplusplus.com上按照模板或教程进行编程。
我已经将代码完全按照网页上的呈现方式(朝向底部)编写好了。
在Code Blocks中,我尝试使用编译器标志"Have g++ follow the C++11 ISO language standard -std=c++11"
我还尝试了标志"Have g++ follow the coming C++0x ISO language standard -std=c++0x"
我尝试过同时使用和单独使用这两个标志,但都不行。
我也手动尝试了这些命令。
另一个我手动尝试的命令是-std=gnu++11,这是线程头部推荐的。

--编辑 看起来__cplusplus小于201103L,这在线程头中已经说明(或者更确切地说被定义)。只有当我手动使用-std=c++11时才会出现这种情况,由于某种原因C::B会在手动声明后删除它,所以我必须使用复选框来使用此标志... --编辑

我的编译器设置如下:

工具链可执行文件选项卡:

C编译器:i686-w64-mingw32-gcc-4.8.1.exe

C++编译器:i686-w64-mingw32-c++.exe

动态链接器:i686-w64-mingw32-c++.exe

静态链接器:ar.exe

调试器:GDB/CDB debugger: default

资源编译器:windres.exe

制作程序:mingw32-make.exe

我尝试使用bin文件夹中的其他可执行文件,但仍然没有运气...我开始怀疑GCC是否支持C++11或线程!?

有人能够在MinGW GCC、Code Blocks或一般情况下使用线程吗?如果可以,你是如何做到的?有哪些链接可以帮助?有什么建议吗?
P.S. 我知道还有其他方式来进行线程处理,例如posix或其他SDK(我已经成功尝试过SFML的线程处理)。但我想使用GCC线程处理,并且我很困惑为什么这么难做,因为所有必要的文件都在那里...
--编辑 我发现当我在Code Blocks之外手动编译程序时,我仍然会得到相同的错误,无论我使用g++ c++还是i686-w64-mingw32-g++/c++。
这是我用来构建文件的命令:
C:\MinGW\mingw32\bin>g++.exe -D__GXX_EXPERIMENTAL_CXX0X__ -o0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -Wc++11-compat -o obj\Debug\main.o "F:\C Projects\Code Blocks\thread\main.cpp"
仍然返回错误:'thread'不是'std'的成员。

这可能是一个糟糕的构建吗?我将尝试其他版本... --编辑


根据这个答案,你需要一个64位版本的Mingw工具链。(我自己从未尝试过。) - Ali
我正在使用正确的MinGW,但是我使用的是Win32线程(运行GCC -v命令确认Win32已设置为线程)。我将尝试下载posix版本并查看是否有效,但是我希望这是一个更适用于win32线程的应用程序。谢谢! - allegory
Ali,谢谢你的文章帮助,但是它对我仍然没有用 :( 请查看我的构建日志编译标志,我尝试尽可能地与fishfoods匹配:i686-w64-mingw32-g++.exe -Wall -g -std=c++11 -c -Wc++11-compat -D__GXX_EXPERIMENTAL_CXX0X__ -c "F:\C Projects\Code Blocks\thread\main.cpp" -o obj\Debug\main.o - allegory
这里是带有-pthread标志的代码,但由于我使用win32作为线程管理器,因此会失败并出现以下错误:i686-w64-mingw32-g++.exe -Wall -g -std=c++11 -c -std=gnu++11 -pthread -Wc++11-compat -D__GXX_EXPERIMENTAL_CXX0X__ -c "F:\C Projects\Code Blocks\thread\main.cpp" -o obj\Debug\main.o 错误:'thread'不是'std'的成员。请注意,我知道它说i686...g++.exe,但我已经尝试了目录中的所有c++编译器,例如g++.exe和c++.exe(显然它附带了多个c++编译器)。 - allegory
我确定pthread已经被移植到了Windows。然而,在Windows上-pthread的作用是不同的故事。-wall标志打开所有警告,这是一个好习惯,而-g则是生成调试信息。这些标志与您的问题无关。 - Ali
显示剩余3条评论
4个回答

3

也许已经太晚回答了,但以下是我成功的解决方案:

1. 从以下网址下载x86_64-w64-mingw32-gcc-4.8-stdthread-win64_rubenvb.7z:

http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/rubenvb/gcc-4.8-experimental-stdthread/

2. 在CodeBlocks中设置一个新编译器,包括:

  • x86_64-w64-mingw32-gcc-4.8.1.exe
  • x86_64-w64-mingw32-g++.exe
  • x86_64-w64-mingw32-g++.exe
  • ar.exe
  • windres.exe
  • mingw32-make.exe

3. 将新编译器设置为您的项目所使用的编译器

  • 右键单击项目 ->构建选项
  • 选择新编译器
  • 在编译器标志下检查-std=c++0x和-std=c++11
  • 在其他选项下设置-std=gnu++11

4. 尽情享受c++11的并发性

希望这对您也有用。或者,您也可以使用Visual Studio作为替代方案。


0

gcc 4.8.1已经完全支持C++11特性。我无法确定Windows的实现情况,但在Linux和OS X上,它可以像广告中所说的那样工作,包括所有并发功能。我只需#include <thread>并调用g++ -std=gnu++11即可正常工作。这是一段最小化的代码,可以很好地编译:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mx;
int i;

void thrfunc();

int main(void)
{
   i=0;
   std::thread          thr1(thrfunc),thr2(thrfunc);

   thr1.join();
   thr2.join();

   return 0;
}

void thrfunc()
{
   mx.lock();
   i++;
   std::cout << std::this_thread::get_id() << " i: " << i << std::endl;
   mx.unlock();
}

大卫,这段代码也编译不正确!当我尝试构建它时,它会向我抛出错误。当我像这样编辑代码时,它就可以了:(请注意,我可以保留包括但不限于函数类或方法在内的这些文件的包含)'#include <iostream>、<thread>和<mutex>//std::mutex mx; int i;void thrfunc();int main(void) { i=0; //std::thread thr1(thrfunc),thr2(thrfunc); //thr1.join(); //thr2.join(); thrfunc(); return 0; }void thrfunc() { //mx.lock(); i++; std::cout << " i: " << i << std::endl; //mx.unlock(); }' - allegory
我收到了错误信息:“命名空间'std'中的'mutex'未命名类型”。我注意到当我手动输入“-std=c++11”作为编译器标志后,构建程序后,我返回到编译器标志,它不再存在。这是唯一会这样做的编译器标志... - allegory
2
我认为可以安全地说,要么a)您的编译器实现不是真正的4.8.1 b)它有问题,或者c)您没有将期望的一些标志传递给它。在Linux下,需要传递-pthread编译器标志,因此可能存在类似的问题。如果您使用MinGW的当前主干版本,则需要确保它确实具有与之相关联的线程模型(例如,Mac和Linux gcc默认使用POSIX线程)。 - David G
据我所知,在Windows上类似于-pthread的选项是-mthread,但它的缺失应该会隐藏std::mutex,只会产生链接器错误或破损的代码。 - DanielKO
Daniel,我已经尝试了-pthread(使用-std=c++11),仍然会抛出相同的错误。我尝试了-mthread(使用-std=c++11),但它没有被识别。也许是-wthread? David,与之相关联的线程模型是Win32(我可以通过gcc -v看到这一点)。除非我绝对必须使用posix,否则我宁愿保持win32。我也想知道是否有编译器标志我错过了,这似乎是真正的问题。再次感谢大家的帮助! - allegory
如果有帮助的话,这是我尝试过的一些标志的构建输出(仍然没有成功 :( ):i686-w64-mingw32-g++.exe -Wall -g -std=c++11 -pthread -c "F:\C Projects\Code Blocks\thread\main.cpp" -o obj\Debug\main.o - allegory

0

0

我想你指的是GCC 4.8.1 - 答案是肯定的,它支持一组C++11特性,包括部分多线程支持。请访问http://gcc.gnu.org/releases.html以查看支持的集合。


是的,我确实是指4.8.1,谢谢,今天真的很长;)虽然它支持它很棒,但为什么我在构建这个东西时遇到了这么多麻烦呢? - allegory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接