代码之家  ›  专栏  ›  技术社区  ›  Alon Gubkin

编译boost.asio示例时出现链接器错误

  •  12
  • Alon Gubkin  · 技术社区  · 15 年前

    我正在努力学习一点C++和Boost.Asio。我试图编译以下代码示例:

    #include <iostream>
    #include <boost/array.hpp>
    #include <boost/asio.hpp>
    
    using boost::asio::ip::tcp;
    
    int main(int argc, char* argv[])
    {
      try
      {
        if (argc != 2)
        {
          std::cerr << "Usage: client <host>" << std::endl;
          return 1;
        }
    
        boost::asio::io_service io_service;
    
        tcp::resolver resolver(io_service);
        tcp::resolver::query query(argv[1], "daytime");
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
    
        tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end)
        {
          socket.close();
          socket.connect(*endpoint_iterator++, error);
        }
        if (error)
          throw boost::system::system_error(error);
    
        for (;;)
        {
          boost::array<char, 128> buf;
          boost::system::error_code error;
    
          size_t len = socket.read_some(boost::asio::buffer(buf), error);
    
          if (error == boost::asio::error::eof)
            break; // Connection closed cleanly by peer.
          else if (error)
            throw boost::system::system_error(error); // Some other error.
    
          std::cout.write(buf.data(), len);
        }
      }
      catch (std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
    
      return 0;
    }
    

    使用以下命令行:

    g++ -I /usr/local/boost_1_42_0 a.cpp
    

    它抛出了一个不清楚的错误:

    /tmp/ccCv9ZJA.o: In function `__static_initialization_and_destruction_0(int, int)':
    a.cpp:(.text+0x654): undefined reference to `boost::system::get_system_category()'
    a.cpp:(.text+0x65e): undefined reference to `boost::system::get_generic_category()'
    a.cpp:(.text+0x668): undefined reference to `boost::system::get_generic_category()'
    a.cpp:(.text+0x672): undefined reference to `boost::system::get_generic_category()'
    a.cpp:(.text+0x67c): undefined reference to `boost::system::get_system_category()'
    /tmp/ccCv9ZJA.o: In function `boost::system::error_code::error_code()':
    a.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x10): undefined reference to `boost::system::get_system_category()'
    /tmp/ccCv9ZJA.o: In function `boost::asio::error::get_system_category()':
    a.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[boost::asio::error::get_system_category()]+0x7): undefined reference to `boost::system::get_system_category()'
    /tmp/ccCv9ZJA.o: In function `boost::asio::detail::posix_thread::~posix_thread()':
    a.cpp:(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD5Ev]+0x1d): undefined reference to `pthread_detach'
    /tmp/ccCv9ZJA.o: In function `boost::asio::detail::posix_thread::join()':
    a.cpp:(.text._ZN5boost4asio6detail12posix_thread4joinEv[boost::asio::detail::posix_thread::join()]+0x25): undefined reference to `pthread_join'
    /tmp/ccCv9ZJA.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor<false> > >::context>::~posix_tss_ptr()':
    a.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorILb0EEEEEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorILb0EEEEEE7contextEED5Ev]+0xf): undefined reference to `pthread_key_delete'
    /tmp/ccCv9ZJA.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor<false> > >::context>::posix_tss_ptr()':
    a.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorILb0EEEEEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorILb0EEEEEE7contextEEC5Ev]+0x22): undefined reference to `pthread_key_create'
    collect2: ld returned 1 exit status
    

    我怎么修?

    3 回复  |  直到 9 年前
        1
  •  20
  •   sisis    15 年前

    你需要链接到libboost-ku系统,显然还需要链接到libboost-ku线程。

    g++ -I /usr/local/boost_1_42_0 -lboost_system -lboost_thread a.cpp
    

    对于多线程库:

    g++ -I /usr/local/boost_1_42_0 -lboost_system-mt -lboost_thread-mt a.cpp
    
        2
  •  2
  •   Timo Geusch    15 年前

    您是否构建了Boost库,或者尝试使用只包含头部的设置来实现这一点?错误看起来是缺少boost系统库,这表明链接器找不到预构建的库。

        3
  •  1
  •   yeeking    12 年前

    您需要告诉G++头文件在哪里、库在哪里以及您使用的库,例如在我的系统上:

    g++  -I /opt/local/include -L /opt/local/lib -lboost_system-mt -lboost_thread-mt a.cpp
    

    其中-i告诉g++头文件在哪里,-l告诉g++实际库在哪里,-lboost_thread-mt是我要链接到-l文件夹中的库。