【问题标题】:Conversion error in boost 1.49/1.50/1.51 ASIO with MinGW & GCC 4.7.0使用 MinGW 和 GCC 4.7.0 的 boost 1.49/1.50/1.51 ASIO 中的转换错误
【发布时间】:2012-09-13 10:53:56
【问题描述】:

当简单地包含 asio.hpp 头文件时,我在 boost::asio 中遇到了一些奇怪的错误,该头文件随后包含其他头文件,直到 win_static_mutex.ipp 生成转换错误。

我将 MinGW 与带有 -std=gnu++11 编译器标志的 GCC 4.7 一起使用(请参阅 here 为什么是 gnu++11 而不是 c++11)。该错误发生在 boost 1.49、1.50 和 1.51(当前)中。

完整的错误如下:

In file included from boost1.49/boost/asio/detail/win_static_mutex.hpp:71:0,
                 from boost1.49/boost/asio/detail/static_mutex.hpp:23,
                 from boost1.49/boost/asio/detail/impl/signal_set_service.ipp:24,
                 from boost1.49/boost/asio/detail/signal_set_service.hpp:210,
                 from boost/asio/signal_set_service.hpp:19,
                 from boost/asio/basic_signal_set.hpp:24,
                 from boost/asio.hpp:26,
                 from MyCode\Client.cpp:3:
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp: In member function 'int boost::asio::detail::win_static_mutex::do_init()':
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp:51:63: error: invalid conversion from 'const wchar_t*' to 'size_t {aka unsigned int}' [-fpermissive]
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp:51:63: error: invalid conversion from 'unsigned int' to 'const wchar_t*' [-fpermissive]
boost1.49/boost/asio/detail/impl/win_static_mutex.ipp:53:10: warning: declaration of 'mutex' shadows a global declaration [-Wshadow]

正如我在开头所说的,我在我的代码中唯一要做的就是包含asio.hpp 标头:

#include <boost/asio.hpp>

boost's win_static_mutex.ipp 文件中的第 43-53 行是(我已经标记了第 51 行):

  using namespace std; // For sprintf.
  wchar_t mutex_name[128];
#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
  swprintf_s(mutex_name, 128,
#else // BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
  swprintf(mutex_name,
#endif // BOOST_WORKAROUND(BOOST_MSVC, >= 1400) && !defined(UNDER_CE)
      L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p",
      static_cast<unsigned int>(::GetCurrentProcessId()), this); // line 51

  HANDLE mutex = ::CreateMutexW(0, TRUE, mutex_name);

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

【问题讨论】:

    标签: c++ boost boost-asio mingw32 gcc4.7


    【解决方案1】:

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

    【讨论】:

    • 胡?所以你建议我应该编辑提升源?当我使用 GCC 时,为什么要链接到 Microsoft 的文档?显然 MinGW 使用了不同的签名(see here)。另外,如果我查看错误输出,函数签名似乎没有问题...
    • @Lukas 什么?不,我不建议这样做。我是说您对swprintf 的调用缺少第二个参数,它应该是缓冲区的大小。从错误消息中实际上很清楚:该函数需要size_t,但提供了wchar_t*
    • 您知道上面的代码 sn-p 确实来自 boost 而不是我的代码? The lines 43-53 from boost's win_static_mutex.ipp
    • @Lukas 啊,我没看到。那我建议你更新你的 Boost 版本,希望能修复这个 bug。
    • 已尝试在 boost 1.50 和 afaik 中使用 boost 1.51 时仍然存在错误(现在将再次尝试)。
    【解决方案2】:

    一个丑陋的“解决方案”是设置编译器标志-fpermissive。 目前我只看到这个“解决方案”,需要等到 boost 再次赶上 GCC 4.7.0...

    【讨论】:

    • 根本不是解决方案。问题在于swprintf 的签名。当然,-fpermissive 允许您将L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p" 作为mutex_name 中的字符数传递,但这在运行时仍然不起作用。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多