使用mingw编译websocketpp示例代码时未定义对`std :: errc :: operation_canceled`的引用 [英] undefined reference to `std::errc::operation_canceled` when compiling websocketpp example code with mingw

查看:291
本文介绍了使用mingw编译websocketpp示例代码时未定义对`std :: errc :: operation_canceled`的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用websocketpp编写一个跨平台程序,该程序使用websockets进行通信.我想使用基于asio的传输层.

I'm trying to use websocketpp to write a cross-platform program that communicates using websockets. I would like to use the asio-based transport layer.

我的理解是,如果我使用的是C ++ 11,则可以将asio配置为独立于boost并使用std::thread,并且websocketpp在这种情况下类似地仅是头文件.

My understanding was that if I am using C++11, I can configure asio to stand-alone from boost and use std::thread, and that websocketpp is similarly header-only under such circumstances.

但是,当我实际上尝试以这种方式编译任何websocketpp教程时,例如tutorials/utility_client,它在g ++和clang上都能正常工作,但是在mingw上却出现奇怪的编译错误:

However, when I actually try to compile any of the websocketpp tutorials this way, such as the tutorials/utility_client, it works fine on g++ and clang, but I get strange compilation errors on mingw:

In file included from websocketpp-0.6.0/include/websocketpp/config/asio_no_tls_client.hpp:32:0,
                 from main.cpp:7:
websocketpp-0.6.0/include/websocketpp/transport/asio/endpoint.hpp: In member function ‘void websocketpp::transport::asio::endpoint<config>::handle_accept(websocketpp::transport::accept_handler, const error_code&)’:
websocketpp-0.6.0/include/websocketpp/transport/asio/endpoint.hpp:764:28: error: ‘operation_canceled’ is not a member of ‘std::errc’
             if (asio_ec == lib::asio::errc::operation_canceled) {
                            ^

我正在摸索这是什么意思,以及如何解决这个问题.这似乎与缺乏增强功能无关-根据

I'm scratching my head as to what this means and how to fix this. This doesn't appear to be related to the lack of boost -- std::errc::operation_canceled appears to be a well-defined C++11 symbol according to this, not always accurate, website. Does this mean my toolchain is broken / defective? I tried installing a different version of the mingw toolchain and it had the same problem.

我找不到对没有类似符号的类似问题的任何人的引用,所以也许我在配置库时出错了?这是我的编译行:

I couldn't find any references to anyone having similar problems with this symbol not being found, so maybe I'm configuring the library wrong? Here is my compilation line:

"$CXX" -std=c++11 -Iasio-1.10.6/include -Iwebsocketpp-0.6.0/include -D_WEBSOCKETPP_CPP11_THREAD_=1 -DASIO_STANDALONE=1 main.cpp -lpthread

我创建了一个存储库以帮助重现我的确切设置,但是这里没有太多内容- -我从各自的存储库中下载了最新发行版中的两个库.由于编译死于main.cpp的其中一个主体,因此似乎并不十分相关,但我只是在使用其教程代码.

I made a repository to assist in reproducing my exact setup, but there's not much going on here -- I downloaded both libs from most recent releases from their respective repos. Since compilation dies in one of the includes the body of main.cpp seems not terribly relevant, but I am just using their tutorial code.

如果有人可以就此给我打个电话,我将不胜感激. :)

If anyone could throw me a line on this I would greatly appreciate it. :)

我不太确定,但是我在mingw-w64上报告了此错误: http://sourceforge.net/p/mingw-w64/support-requests/105/

I am not really sure but I have reported this as a bug at mingw-w64: http://sourceforge.net/p/mingw-w64/support-requests/105/

推荐答案

我已经将其报告为mingw-w64中的错误

I have reported this as a bug at mingw-w64

mingw-w64编译器不符合C ++ 11,没有定义此错误代码, 但是人们已经知道了,这是故意的. (尽管随便我不 知道为什么他们无法修复它.)

The mingw-w64 compiler is C++11 non-compliant in not defining this error-code, but the folks already know that and it's deliberate. (Although offhand I don't know why they couldn't fix it.)

相关的头文件是:

<toochain_dir>/mingw64/x86_64-w64-mingw32/include/c++/x86_64-w64-mingw32/bits/error_constants.h

这是enum class std::errc的定义:

// Most of the commented-out error codes are socket-related and could be
// replaced by Winsock WSA-prefixed equivalents.
  enum class errc
    {
//    address_family_not_supported =        EAFNOSUPPORT,
//    address_in_use =              EADDRINUSE,
//    address_not_available =           EADDRNOTAVAIL,
//    already_connected =           EISCONN,
      argument_list_too_long =          E2BIG,
      argument_out_of_domain =          EDOM,
      bad_address =                 EFAULT,
      bad_file_descriptor =             EBADF,
//    bad_message =                 EBADMSG,
      broken_pipe =                 EPIPE,
//    connection_aborted =          ECONNABORTED,
//    connection_already_in_progress =      EALREADY,
//    connection_refused =          ECONNREFUSED,
//    connection_reset =            ECONNRESET,
//    cross_device_link =           EXDEV,
//    destination_address_required =        EDESTADDRREQ,
      device_or_resource_busy =         EBUSY,
      directory_not_empty =             ENOTEMPTY,
      executable_format_error =         ENOEXEC,
      file_exists =                     EEXIST,
      file_too_large =              EFBIG,
      filename_too_long =           ENAMETOOLONG,
      function_not_supported =          ENOSYS,
//    host_unreachable =            EHOSTUNREACH,
//    identifier_removed =          EIDRM,
      illegal_byte_sequence =           EILSEQ,
      inappropriate_io_control_operation =  ENOTTY,
      interrupted =                 EINTR,
      invalid_argument =            EINVAL,
      invalid_seek =                ESPIPE,
      io_error =                EIO,
      is_a_directory =              EISDIR,
//    message_size =                EMSGSIZE,
//    network_down =                ENETDOWN,
//    network_reset =               ENETRESET,
//    network_unreachable =             ENETUNREACH,
//    no_buffer_space =             ENOBUFS,
#ifdef _GLIBCXX_HAVE_ECHILD
      no_child_process =            ECHILD,
#endif
//    no_link =                 ENOLINK,
      no_lock_available =           ENOLCK,
//    no_message_available =            ENODATA,
//    no_message =              ENOMSG,
//    no_protocol_option =          ENOPROTOOPT,
#ifdef _GLIBCXX_HAVE_ENOSPC
      no_space_on_device =          ENOSPC,
#endif
//    no_stream_resources =             ENOSR,
      no_such_device_or_address =       ENXIO,
      no_such_device =              ENODEV,
      no_such_file_or_directory =       ENOENT,
      no_such_process =             ESRCH,
      not_a_directory =             ENOTDIR,
//    not_a_socket =                ENOTSOCK,
//    not_a_stream =                ENOSTR,
//    not_connected =               ENOTCONN,
      not_enough_memory =           ENOMEM,
#ifdef _GLIBCXX_HAVE_ENOTSUP
      not_supported =               ENOTSUP,
#endif
//    operation_canceled =          ECANCELED,
//    operation_in_progress =           EINPROGRESS,
#ifdef _GLIBCXX_HAVE_EPERM
      operation_not_permitted =         EPERM,
#endif
//    operation_not_supported =         EOPNOTSUPP,
#ifdef _GLIBCXX_HAVE_EWOULDBLOCK
      operation_would_block =           EWOULDBLOCK,
#endif
//    owner_dead =              EOWNERDEAD,
      permission_denied =           EACCES,
//    protocol_error =              EPROTO,
//    protocol_not_supported =          EPROTONOSUPPORT,
      read_only_file_system =           EROFS,
      resource_deadlock_would_occur =       EDEADLK,
      resource_unavailable_try_again =      EAGAIN,
      result_out_of_range =             ERANGE,
//    state_not_recoverable =           ENOTRECOVERABLE,
//    stream_timeout =              ETIME,
//    text_file_busy =              ETXTBSY,
#ifdef _GLIBCXX_HAVE_ETIMEDOUT
      timed_out =               ETIMEDOUT,
#endif
      too_many_files_open_in_system =       ENFILE,
      too_many_files_open =             EMFILE,
      too_many_links =              EMLINK
//    too_many_symbolic_link_levels =       ELOOP,
#ifdef _GLIBCXX_HAVE_EOVERFLOW
    ,
      value_too_large =             EOVERFLOW
#endif
//    wrong_protocol_type =             EPROTOTYPE
   };

您看到operation_canceled是其中之一.

根据此处的建议,您将需要使用winsock错误代码WSAECANCELLED, 在winerror.h中定义.如果您想要便携性,那么您当然需要 根据主机OS的编译时确定,使用此命令,而不使用std::errc::operation_canceled作为条件.

As suggested there, you will need to use the winsock error code WSAECANCELLED, defined in winerror.h. If you want portability, of course you'll need to make this use rather than std::errc::operation_canceled conditional upon compiletime determination of the host OS.

这篇关于使用mingw编译websocketpp示例代码时未定义对`std :: errc :: operation_canceled`的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆