2010-04-02 11 views
10

Tôi đang cố gắng tìm hiểu một chút C++ và Boost.Asio. Tôi đang cố gắng để biên dịch các mã ví dụ sau đây:Lỗi trình liên kết khi biên dịch ví dụ 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; 
} 

Với dòng lệnh sau:

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

và nó ném một lỗi không rõ ràng:

/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 

Làm thế nào tôi có thể sửa chữa nó ?

+3

Chỉ cần một lưu ý phụ, khi tôi đã thử tạo các ví dụ trên http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html bằng cách sử dụng '-lboost_system -lboost_thread -pthread' đã làm cho tôi. – Logan

Trả lời

18

bạn cần liên kết với libboost_system và dường như cũng chống lại libboost_thread.

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

trong trường hợp các thư viện đa luồng:

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

'/ usr/bin/ld: không thể tìm thấy -lboost_system collect2: ld trả lại 1 trạng thái thoát ' –

+0

Tính năng auto_linking tăng có hoạt động với gcc hay bạn phải chỉ định tất cả thư viện trên dòng lệnh? –

+0

@Time Geusch: liên kết tự động không hoạt động với gcc: http://www.boost.org/doc/libs/1_42_0/more/getting_started/windows.html#auto-linking – sisis

2

Bạn đã xây dựng các thư viện tăng hoặc bạn đang cố gắng làm điều này với một thiết lập header-chỉ? Lỗi trông giống như thư viện boost_system bị thiếu, điều này sẽ gợi ý rằng trình liên kết không thể tìm thấy thư viện dựng sẵn.

1

Bạn cần thông báo cho g ++ nơi tệp tiêu đề ở đâu, thư viện ở đâu và thư viện nào bạn đang sử dụng, ví dụ: trên hệ thống của tôi:

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

nơi -Tôi nói với g ++ nơi các tập tin tiêu đề đang có và -L nói với g ++ nơi các thư viện thực tế đang có và -lboost_thread-mt là thư viện tôi muốn liên kết chống lại trong thư mục -L.