【问题标题】:error: ‘io_context’ is not a member of ‘boost::asio’ and error: ‘steady_timer’ is not a member of ‘boost::asio’错误:“io_context”不是“boost::asio”的成员,错误:“steady_timer”不是“boost::asio”的成员
【发布时间】:2020-06-23 19:25:11
【问题描述】:

我陷入了我的第一个 asio 代码中。我已经阅读了官方网站上教程的第一部分(https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/tutorial/tuttimer1.html)

这里是代码

#include <iostream>
#include <boost/asio.hpp>

    int main()
    {
        boost::asio::io_context io;
        boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
        t.wait();
        std::cout << "First app with asio!" << std::endl;
    
        return 0;
    }

这里有错误

egor@PC:~/Documents/Programming/boost_asio_practice$ g++ trial.cpp
trial.cpp: In function ‘int main()’:
trial.cpp:6:15: error: ‘io_context’ is not a member of ‘boost::asio’
  boost::asio::io_context io;
               ^~~~~~~~~~
trial.cpp:6:15: note: suggested alternative: ‘connect’
  boost::asio::io_context io;
               ^~~~~~~~~~
               connect
trial.cpp:7:15: error: ‘steady_timer’ is not a member of ‘boost::asio’
  boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
               ^~~~~~~~~~~~
trial.cpp:7:15: note: suggested alternative: ‘deadline_timer’
  boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
               ^~~~~~~~~~~~
               deadline_timer
trial.cpp:8:2: error: ‘t’ was not declared in this scope
  t.wait();
  ^
trial.cpp:8:2: note: suggested alternative: ‘tm’
  t.wait();
  ^
  tm

更新: 我已经安装了最新版本的 boost。现在我收到这些错误,我该怎么办?

/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_event::posix_event()':
trial.cpp:(.text._ZN5boost4asio6detail11posix_eventC2Ev[_ZN5boost4asio6detail11posix_eventC5Ev]+0x4d): undefined reference to `pthread_condattr_setclock'
/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_thread::~posix_thread()':
trial.cpp:(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD5Ev]+0x26): undefined reference to `pthread_detach'
/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_thread::join()':
trial.cpp:(.text._ZN5boost4asio6detail12posix_thread4joinEv[_ZN5boost4asio6detail12posix_thread4joinEv]+0x2b): undefined reference to `pthread_join'
/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_thread::start_thread(boost::asio::detail::posix_thread::func_base*)':
trial.cpp:(.text._ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE[_ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE]+0x3a): undefined reference to `pthread_create'
/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_signal_blocker::posix_signal_blocker()':
trial.cpp:(.text._ZN5boost4asio6detail20posix_signal_blockerC2Ev[_ZN5boost4asio6detail20posix_signal_blockerC5Ev]+0x64): undefined reference to `pthread_sigmask'
/tmp/ccArqi4D.o: In function `boost::asio::detail::posix_signal_blocker::~posix_signal_blocker()':
trial.cpp:(.text._ZN5boost4asio6detail20posix_signal_blockerD2Ev[_ZN5boost4asio6detail20posix_signal_blockerD5Ev]+0x2d): undefined reference to `pthread_sigmask'
collect2: error: ld returned 1 exit status

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    您可能使用的是旧版本的 boost。相当老:1.66¹的文档已经说明:

    https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/io_service.html

    时光机

    这里是 Live On Wandbox 和 1.65.1:

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main() {
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
        t.wait();
        std::cout << "First app with asio!" << std::endl;
    }
    

    打印

    First app with asio!
    

    回到未来

    再次Live On Wandbox 使用 1.73.1:

    #include <boost/asio.hpp>
    #include <iostream>
    
    int main() {
        boost::asio::io_context io;
        boost::asio::steady_timer t(io, boost::asio::chrono::seconds(5));
        t.wait();
        std::cout << "First app with asio!" << std::endl;
    }
    

    打印

    First app with asio!
    

    ¹ 2017 年 12 月 18 日

    【讨论】:

    • 我安装了最新版本的 boost。但我收到错误(有问题的 UPD)
    • 链接线程库,正如消息中所说的那样(它通常会说一些“DSO”后跟库名称。但是对于线程,您可以使用内置编译器标志“-threads”这将做正确的事情
    • 哇。我将 hte 标志“-pthread”放入编译器并解决了。但是为什么我必须这样做,这正常吗?每次都能正常工作吗?
    • @Egor 是的,这不是魔法。计算没有奇迹。 Just complexity。对于一般答案,请参阅linking (phases of translation),特别是your error message。注意c++-faq标签:)
    • 我衷心建议您了解编译模型,因为这些是最令人沮丧的问题,而且您总是会遇到。越早掌握它们越好。
    猜你喜欢
    • 2020-08-11
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2013-12-21
    相关资源
    最近更新 更多