【问题标题】:C++11, GCC 4.8.1,Code::Blocks, threading, what a head acheC++11, GCC 4.8.1,Code::Blocks, 线程, 真是头疼
【发布时间】:2013-09-27 21:20:23
【问题描述】:

--编辑 如果您想使用 MinGW GCC 8.4.1 和 threads/mutex/futures/atomics,请不要下载 Win32 threader 版本 insted 下载 Posix 版本。 --编辑

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

我已解压并正确确认 MinGW GCC 4.8.1(修订版 5)已安装在 C:\MinGW\mingw32 中。 我已设置代码块以寻找最新最好的编译器在正确的路径中(我确信这一点)。我可以使用 #include iostream 编译一个普通程序。 现在,当我尝试使用 #include thread 运行一个程序时,它给了我 "error: 'thread'不是“std”的成员。

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

我在 cplusplus.com 上遵循某种模板或教程
我的代码与网页上显示的完全相同(朝向底部)。
我尝试在代码块中使用编译器标志 “让 g++ 遵循 C++11 ISO 语言标准 -std=c++11”。

我也尝试过标记“让 g++ 遵循即将到来的 C++0x ISO 语言标准 -std=c++0x”

我同时尝试过,一次一个,没有。 我也尝试过手动这些命令。

我手动尝试的另一个命令是 -std=gnu++11,这是线程头中推荐的。


--编辑 似乎 __cplusplus 是 --编辑

Toolchain Executables 选项卡下我的编译器设置如下:

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

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

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

静态链接器:ar.exe

调试器:GDB/CDB 调试器:默认

资源编译器:windres.exe

制作程序:mingw32-make.exe

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

有没有人能够让线程与 MinGW GCC、代码块或一般情况下一起工作? 如果是这样,你是怎么做到的?任何可能有帮助的链接?有什么建议吗?

附:我知道还有其他线程方式,例如 posix 或其他 SDK,例如 SFML(我已成功尝试使用此线程)。但我想使用 GCC 线程,我很困惑为什么看到所有必要的文件都这么难......

--编辑 我发现当我在代码块之外手动编译程序时,无论我使用 g++ c++ 还是 i686-w64-mingw32-g++/c++,我仍然会遇到相同的错误

这是我为构建文件而运行的命令:

C:\MinGW\mingw32\bin>g++.exe -D__GXX_EXPERIMENTAL_CXX0X__ -o0 -g3 -Wall -c -fmes sage-length=0 -std=c++11 -Wc++11-compat -o obj\Debug\main.o "F:\C Projects\Code Blocks\thread\main.cpp"

仍然返回错误:'thread' 不是 'std' 的成员

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

【问题讨论】:

  • 根据this answer,您需要一个 64 位版本的 Mingw 工具链。 (我自己从未尝试过。)
  • 我使用的是正确的 MinGW,而不是 posix 线程我使用的是 Win32 线程(运行 GCC -v 命令确认 Win32 已设置为线程)。我将尝试下载 posix 版本,看看是否可行,但是,我确实希望这更像是一个 win32 线程应用程序。谢谢!
  • 阿里,谢谢你,我已经尝试过你的文章帮助,但它仍然对我不起作用:(查看我的构建日志编译标志,我试图将它们与 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
  • 你得到什么错误?和你在标题中说的一样吗?您可以尝试将 -pthread 添加到编译器标志吗? (在 Linux 上工作,我不知道 -pthread 在 Windows 上的作用。)如果您仍然遇到相同的错误,那么最可能的解释是您的机器上出现了问题并且您包含了错误的头文件。我知道这对你没有多大帮助......对不起。 :(
  • 这里是带有 -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 error: 'thread' is not a member of 'std' 请注意我知道它说 i686...g++.exe 但我尝试了目录中的所有 c++ 编译器,即我用 g++.exe c++ 尝试过.exe(显然它带有多个 c++ 编译器)。

标签: c++ multithreading gcc c++11 codeblocks


【解决方案1】:

回答可能会迟到,但这对我有用:

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.在代码块中设置一个新的编译器

  • 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。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我安装了最新的 MinGW-Builds

    http://sourceforge.net/projects/mingwbuilds/files/mingw-builds-install/ 并将我的工具链可执行文件设置为:

    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】:

      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();
      }
      

      【讨论】:

      • David,该代码也无法正确编译!当我尝试构建它时,它会向我抛出错误。当我像这样编辑代码时它很好:(注意我可以保留包含但这些文件中的任何函数类或方法都不起作用)'#include #include #include //std: :互斥体MX;诠释我;无效 thrfunc(); int main(void) { i=0; //std::thread thr1(thrfunc),thr2(thrfunc); //thr1.join(); //thr2.join(); thrfunc();返回0; } void thrfunc() { //mx.lock();我++; std::cout
      • 我得到 错误:命名空间 'std' 中的 'mutex' 没有命名类型。 ** 我注意到,当我为 compiler flags 手动输入 **-std=c++11 时, 在构建程序后我返回 compiler flags 它不再存在了。它是唯一这样做的编译器标志...
      • 那么我认为可以肯定地说 a) 你的编译器实现不是真正的 4.8.1 b) 它被破坏了,或者 c) 你没有传递它期望的一些标志。在 Linux 下,需要传递 -pthread 编译器标志,因此可能存在类似的问题。如果您使用的是当前的主干版本的 MinGW,您需要确保它确实具有与之关联的线程模型(例如,Mac 和 Linux gcc 默认使用 POSIX 线程。)
      • IIRC -pthread 在 Windows 上的类似选项是 -mthread,但它的缺失应该隐藏 std::mutex,只会产生链接器错误或损坏的代码。
      • Daniel, 我试过 -pthread(使用 -std=c++11)仍然会抛出同样的错误。我试过 -mthread (使用 -std=c++11)但它没有识别它。也许-wthread? David, 与之关联的线程模型是 Win32(我可以通过 gcc -v 看到这一点)。除非我绝对必须使用 posix,否则我宁愿保留它 win32。我也想知道我是否缺少编译器标志,这听起来像是真正的问题。 再次感谢大家的帮助!
      【解决方案4】:

      我认为您的意思是 GCC 4.8.1 - 答案是肯定的,它支持一组 C++11 功能,包括部分多线程支持。请访问http://gcc.gnu.org/releases.html查看支持的设置。

      【讨论】:

      • 是的,我的意思是 4.8.1,谢谢,这是漫长的一天;)支持它真是太好了,但是为什么我在构建这个东西时遇到这么麻烦呢?
      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2013-11-22
      • 1970-01-01
      相关资源
      最近更新 更多