我正在使用MinGW 5.3.0和Crypto ++ 5.6.5:
C:\MinGW>g++ -std=c++11 -s -D_WIN32_WINNT=0x0501 LOG.cpp -U__STRICT_ANSI__ Decclass.cpp \
-IC:\\MinGW\\ -IC:\\MinGW\\boost -LC:\\MinGW -lssl -lcrypto -lcryptopp -lgdi32 -lPCRYPT \
-lz -ltiny -lwsock32 -lws2_32 -lShlwapi
在下面的错误中编译结果。
c:\mingw\cryptopp565\include\cryptopp\misc.h:287:14: error: 'mutex' in namespace 'std'
does not name a typestatic std::mutex s_mutex;
c:\mingw\cryptopp565\include\cryptopp\misc.h:296:18: error: 'mutex' is not a member of
'std'std::lock_guard<std::mutex> lock(s_mutex);
显示&#39;互斥量&#39;不是&#39;
的成员我需要花粉版的MinGW吗? 或者我可以修复此构建本身吗?
答案 0 :(得分:2)
我通过修改路径中的&#34; misc.h&#34; 来解决此问题&#34; cryptopp565 \ include \ cryptopp \ misc.h&#34;
在 misc.h 的顶部,我包含提升库
中的 mutex.hpp#include "c:\mingw\include\boost\asio\detail\mutex.hpp"
我将名称空间从标准更改为 boost :: asio :: detail
static std::mutex s_mutex;
static boost::asio::detail::mutex s_mutex;
答案 1 :(得分:0)
MINGW 仅支持带有 POSIX 线程的 std::thread 和 std::mutex,这绝对是非 POSIX 版本的空白。
现在,您无需为单个程序切换开发环境。
选项是从 POSIX 特定模板(由 _GLIBCXX_HAS_GTHREADS 选择的那些代码分支)或 MS-Sources 或 BOOST 库构建存根...
答案 2 :(得分:-1)
我认为我们可能已经大部分在cryptopp Commit e4cef84883b2清除了这个MinGW / C ++ 11问题。您应该在Master工作或执行git pull
,然后取消注释config.h
: 65中CRYPTOPP_NO_CXX11
的定义(或左右):
// Define CRYPTOPP_NO_CXX11 to avoid C++11 related features shown at the
// end of this file. Some compilers and standard C++ headers advertise C++11
// but they are really just C++03 with some additional C++11 headers and
// non-conforming classes. You might also consider `-std=c++03` or
// `-std=gnu++03`, but they are required options when building the library
// and all programs. CRYPTOPP_NO_CXX11 is probably easier to manage but it may
// cause -Wterminate warnings under GCC. MSVC++ has a similar warning.
// Also see https://github.com/weidai11/cryptopp/issues/529
// #define CRYPTOPP_NO_CXX11 1
我认为问题在于,您遇到了与Windows相关的问题及其缺乏正确的C ++ 11支持,但您间接得到了它们。它们是间接的,因为MinGW和GCC是最重要的。 MinGW和GCC不可能提供C ++ 11,因为底层平台不能。
我认为此时最好的选择是定义CRYPTOPP_NO_CXX11
。我不相信我们可以像在Windows上那样为你做这件事,因为我们需要访问的定义隐藏在MinGW和GCC之后。我们还有一些MSVC ++错误可以解决。
以下是我们在Windows上的操作方式,但我们无法访问MinGW中的这些定义(来自config.h
:950):
// Dynamic Initialization and Destruction with Concurrency ("Magic Statics")
// MS at VS2015 with Vista (19.00); GCC at 4.3; LLVM Clang at 2.9; Apple Clang at 4.0; Intel 11.1; SunCC 5.13.
// Microsoft's implementation only works for Vista and above, so its further
// limited. http://connect.microsoft.com/VisualStudio/feedback/details/1789709
#if (CRYPTOPP_MSC_VERSION >= 1900) && ((WINVER >= 0x0600) || (_WIN32_WINNT >= 0x0600)) || \
(CRYPTOPP_LLVM_CLANG_VERSION >= 20900) || (CRYPTOPP_APPLE_CLANG_VERSION >= 40000) || \
(__INTEL_COMPILER >= 1110) || (CRYPTOPP_GCC_VERSION >= 40300) || (__SUNPRO_CC >= 0x5130)
# define CRYPTOPP_CXX11_DYNAMIC_INIT 1
#endif // Dynamic Initialization compilers
如果您定义CRYPTOPP_NO_CXX11
,则以下不将被定义,您将避免出现问题:CRYPTOPP_CXX11_DYNAMIC_INIT
,CRYPTOPP_CXX11_SYNCHRONIZATION
和{{1} }。