【问题标题】:Some C++11 features missing when using Code Blocks 13.12, MinGW 4.8.1 and SFML 2.1使用代码块 13.12、MinGW 4.8.1 和 SFML 2.1 时缺少一些 C++11 功能
【发布时间】:2014-01-31 06:54:13
【问题描述】:

在竭尽全力之后转向 Stack Overflow。
我在 Windows 7 OS 64 位系统上运行 Code Blocks 13.12 和 MinGW 4.8.1。我花了两天时间试图让编译器(静态)链接到 SFML 2.1 库。我关注了 SFML tutorialthis 视频教程 - 在最终链接之前重新安装了 Code Blocks 和 MinGW 两次。
在那之后,我松了一口气,SFML 被识别了,但是当我尝试构建和运行时,我遇到了 50 个错误,表明 C++11 功能没有。
在编译器选项中添加了-std=gnu++11,其中 13 个错误消失了。
其余的错误都分为两类:mutex 不是 std 的成员从时间 t 开始不是 chrono::_V2::steady 时钟的成员。我什至不确定 _V2 是什么。

我错过了什么?

-------------- Build: Release in PumpTracker2.0 (compiler: GNU GCC Compiler)---------------

mingw32-g++.exe -Wall -std=gnu++11 -DSFML_STATIC -O2 -std=gnu++11 -IC:\SFML-2.1\include -IC:\SFML-2.1\include -c C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp -o obj\Release\main.o

In file included from C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:25:0:
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\Account.h:37:1: error: 'mutex' in namespace 'std' does not name a type
 std::mutex mu;
 ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\Account.h:86:22: error: 'to_time_t' is not a member of 'std::chrono::_V2::steady_clock'
   time_t currentTp = std::chrono::steady_clock::to_time_t(newly);

C:\Users\WITcom\Desktop\C++\PumpTracker2.0\Account.h:94:48: error: 'from_time_t' is not a member of 'std::chrono::_V2::steady_clock'
   std::chrono::steady_clock::time_point tNew = std::chrono::steady_clock::from_time_t(currentTp);
                                                ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:51:2: error: 'mutex' is not a member of 'std'
  std::mutex mu3;
  ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:51:13: error: expected ';' before 'mu3'
  std::mutex mu3;
             ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:52:19: error: 'mutex' was not declared in this scope
  std::unique_lock<mutex> locker3(mu3, std::defer_lock);
                   ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:52:24: error: template argument 1 is invalid
  std::unique_lock<mutex> locker3(mu3, std::defer_lock);
                        ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:52:33: error: invalid type in declaration before '(' token
  std::unique_lock<mutex> locker3(mu3, std::defer_lock);

C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:214:22: error: 'to_time_t' is not a member of 'std::chrono::_V2::steady_clock'
       pS->tpNewest = std::chrono::steady_clock::to_time_t(NextPump);
                      ^
C:\Users\WITcom\Desktop\C++\PumpTracker2.0\main.cpp:245:51: error: 'from_time_t' is not a member of 'std::chrono::_V2::steady_clock'
       std::chrono::steady_clock::time_point TT2 = std::chrono::steady_clock::from_time_t(pS->tpNewest);
                                                   ^
Process terminated with status 1 (0 minute(s), 4 second(s))
37 error(s), 47 warning(s) (0 minute(s), 4 second(s))

【问题讨论】:

  • 请完整发布您看到的实际错误消息,并可能提出原因。
  • 感谢您最初的回复,迈克。我已经发布了一些错误 - 最相关的易于阅读。
  • 假设您使用-std=c++11 构建,error: 'mutex' in namespace 'std' does not name a type 可能是由于标题 未包含在具有该错误的文件中。我无法就to_time_tfrom_time_t 错误提出任何建议。
  • 标准的 MinGW 发行版滞后很多,大部分已经转向 mingw64,我建议nuwen distribution
  • 见鬼的建议,Mgetz。我现在减少到 17 个错误——所有处理 time_t 的错误都消失了,这非常令人鼓舞。但是,仍然无法识别 和朋友。也许 Mike 是对的,并且标题 没有被包括在内。我会进一步调查。任何其他建议都非常受欢迎。

标签: c++11 mingw codeblocks sfml


【解决方案1】:

如前所述,如果您想使用最新的功能,原始 MinGW 发行版并不是最好的选择。相反,有像 Nuwen(Stephan T. Lavavej 的网站)和 MinGW Builds 这样的项目提供 MinGW-w64 二进制文件。

提及 SFML 具有误导性,因为这些问题与 SFML 完全无关。但是请记住,如果您更改编译器,则必须重新构建 SFML!

作为下一步,发布重现错误的源代码的最小示例非常重要,因为现在,我们只能根据错误猜测出了什么问题。

如果您不明确使用 GNU 扩展,则应使用 -std=c++11 而不是 -std=gnu++11,如果您查看 build 命令,您会注意到它被包含两次,这不是必需的。

现在对错误进行一些猜测:

  • Account.h - 确保包含 &lt;mutex&gt; 标头。
  • main.cpp - 确保包含 &lt;mutex&gt; 标头。
  • main.cpp - 如果std::unique_lock&lt;mutex&gt; 来自您的代码,那么您需要添加std::,即std::unique_lock&lt;std::mutex&gt;
  • main.cpp - time_t 事情似乎已经解决了,但无论如何都要确保包含&lt;chrono&gt;&lt;ctime>(因为time_t&lt;ctime&gt; 中定义)。

【讨论】:

  • 关于 -std=c++11 与 -std=gnu++11 的注释很好。在转向 SO 之前,我考虑了您清单中的所有元素。发布了一些关于 SFML 的文章,因为将其库链接到 MinGW 编译器同时保留 C++11 功能似乎是一个常见问题,我想向其他人指出至少部分解决方案的方向。我一直在读到 Windows 提供的 C++11 支持最少,所以也许我应该切换到 Ubuntu?
  • 我从未听说过在链接 SFML 和 C++11 方面有任何问题,相信我,我知道(SFML 论坛上的 3.8k 帖子)...您一定在阅读奇怪的资源, C++11 和 Windows 本身没有任何关系,都是编译器的问题。 Windows 不关心您是用 Assembly、C98、C++1y 还是 Delphi 编写代码,只要您可以将其编译为 Windows 可执行文件即可。 MinGW-w64 4.8.1 甚至 4.9 具有 GCC has implemented 的所有 C++11 特性。
猜你喜欢
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2014-07-23
  • 2013-04-14
  • 2012-06-12
  • 2013-10-03
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多