C++ 带MinGW&;的boost 1.49/1.50/1.51 ASIO中的转换错误;GCC 4.7.0

C++ 带MinGW&;的boost 1.49/1.50/1.51 ASIO中的转换错误;GCC 4.7.0,c++,boost,boost-asio,mingw32,gcc4.7,C++,Boost,Boost Asio,Mingw32,Gcc4.7,我从boost::asio中得到了一些奇怪的错误,当简单地包含asio.hpp头文件时,它会包含其他头文件,直到win\u static\u mutex.ipp在其中生成转换错误 我将MinGW与gcc4.7一起使用,并带有-std=gnu++11编译器标志(请参见为什么是gnu++11而不是c++11)。错误发生在升压1.49、1.50和1.51(电流)中 完整的错误如下所示: 在boost1.49/boost/asio/detail/win\u static\u mutex.hpp:71:0

我从boost::asio中得到了一些奇怪的错误,当简单地包含
asio.hpp
头文件时,它会包含其他头文件,直到
win\u static\u mutex.ipp
在其中生成转换错误

我将MinGW与gcc4.7一起使用,并带有-std=gnu++11编译器标志(请参见为什么是gnu++11而不是c++11)。错误发生在升压1.49、1.50和1.51(电流)中

完整的错误如下所示:

在boost1.49/boost/asio/detail/win\u static\u mutex.hpp:71:0中包含的文件中,
从boost1.49/boost/asio/detail/static_mutex.hpp:23,
来自boost1.49/boost/asio/detail/impl/signal\u set\u service.ipp:24,
来自boost1.49/boost/asio/detail/signal\u set\u service.hpp:210,
来自增压/asio/信号设置服务。hpp:19,
来自增压/asio/基本信号设置。hpp:24,
从升压/asio.hpp:26,
来自MyCode\Client.cpp:3:
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp:在成员函数“int boost::asio::detail::win_static_mutex::do_init()”中:
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp:51:63:错误:从“const wchar_t*”到“size_t{aka unsigned int}”的转换无效[-fppermissive]
boost1.49/boost/asio/detail/impl/win\u static\u mutex.ipp:51:63:错误:从“unsigned int”到“const wchar\u t*”的转换无效[-fppermissive]
boost1.49/boost/asio/detail/impl/win\u static\u mutex.ipp:53:10:警告:声明“mutex”会影响全局声明[-Wshadow]
正如我在开始时所说,我在我的代码中所做的唯一一件事就是包含
asio.hpp
标题:

#包括
boost的
win\u static\u mutex.ipp
文件中的第43-53行是(我已经标记了第51行):

使用命名空间std;//斯普林特。
wchar_t mutex_name[128];
#如果BOOST\u变通方法(BOOST\u MSVC,>=1400)&!已定义(在下)
swprintf_s(互斥体名称,128,
#else//BOOST\u解决方案(BOOST\u MSVC,>=1400)和&!已定义(在CE下)
swprintf(互斥体名称,
#endif//BOOST\u解决方案(BOOST\u MSVC,>=1400)和&!已定义(在CE下)
L“asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p”,
静态转换(::GetCurrentProcessId()),this);//第51行
HANDLE mutex=::CreateMutexW(0,TRUE,mutex\u name);

现在是否需要定义一些定义或任何其他编译器标志,或者是否需要直接在boost中更改某些内容,或者是需要更改MinGW中的某些内容?

这似乎是boost中的错误。您可以尝试将boost更新到更高版本(1.51可用)希望它在这里得到修复,否则您应该将其报告为bug。

一个丑陋的“解决方案”是设置编译器标志
-fppermissive

目前我只看到这个“解决方案”,需要等到boost再次赶上GCC 4.7.0…

Hu?所以你建议我编辑boost源代码?当我使用GCC时,为什么要链接到Microsoft的文档?显然MinGW使用了不同的签名()。另外,如果我查看错误输出,则函数签名似乎没有问题…@Lukas What?不,我不建议这样做。我是说,您对
swprintf
的调用缺少第二个参数,该参数应该是缓冲区的大小。从错误消息中可以清楚地看出:函数需要
大小_t
但是提供了
wchar\u t*
。你知道上面的代码片段确实来自boost而不是我的代码吗?
boost的win\u static\u互斥锁的第43-53行。ipp
@Lukas啊,我没有看到。然后我建议你更新你的boost版本,并希望bug得到修复。已经尝试过了,boost 1仍然存在错误。50和afaik以及boost 1.51(现在将再次尝试)。根本不是解决方案。问题在于
swprintf
的签名。当然,
-fpermissive
允许您通过
L“asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p”
作为互斥体名称中的字符数,但在运行时仍然不起作用。