c++11 - 使用代码块 13.12、MinGW 4.8.1 和 SFML 2.1 时缺少一些 C++11 功能

标签 c++11 mingw codeblocks sfml

在用尽我所有的努力后转向 Stack Overflow。
我在 Windows 7 操作系统 64 位系统上运行代码块 13.12 和 MinGW 4.8.1。我花了两天时间尝试让编译器(静态)链接到 SFML 2.1 库。我遵循了 SFML tutorialthis视频教程 - 在最终链接之前重新安装 Code Blocks 和 MinGW 两次。
之后,我松了口气,因为 SFML 被识别了,但当我尝试构建和运行时,我遇到了 50 个错误,表明 C++11 功能未被识别。
-std=gnu++11 添加到编译器选项中,其中 13 个错误消失了。
其余错误都分为两类:互斥量不是 std 的成员从时间 t 开始不是 chrono::_V2::steady Clock 的成员。我什至不确定 _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))

最佳答案

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

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

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

如果您不明确使用 GNU 扩展,则应使用 -std=c++11而不是-std=gnu++11如果您查看构建命令,您会发现它被包含了两次,这是没有必要的。

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

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

关于c++11 - 使用代码块 13.12、MinGW 4.8.1 和 SFML 2.1 时缺少一些 C++11 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075852/

相关文章:

c++ - 如何有条件地为 Eclipse 中的交叉编译项目包含两个相同版本的不同名称的库?

c++ - 对 `Cat::Grizzly()' 的 undefined reference |

C错误: "Undefined reference to ' sf_open'"from libsndfile

c++ - 如何将所有指针从一个 vector 移动到另一个 vector ?

c++ - 使用什么代替 `static const TCHAR *`

c++ - 如何将 C++11 std::stoi 与 gcc 一起使用?

c++ - MinGW 和 __uuidof

visual-c++ - WAF:MinGW (GCC) 和 MSVC 2012 之间的冲突

c - 什么情况导致该程序由于 EOF 字符而提前离开 for 循环?

c++ - C++:将lambda作为带有模板参数的函数进行传递会使推导模板类型失败