2011-10-02 98 views
0

我无法理解编译boost程序的基础知识。我正在与Fedora 15合作,通过/ usr/include/boost中的yum安装boost。我也提升了安装。编译boost程序

我真的很想知道如何链接boost库并在终端下编译以下示例,并使用boost-jam/build。

// 
// reference_counted.cpp 
// ~~~~~~~~~~~~~~~~~~~~~ 
// 
// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com) 
// 
// Distributed under the Boost Software License, Version 1.0. (See accompanying 
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
// 

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/enable_shared_from_this.hpp> 
#include <boost/shared_ptr.hpp> 
#include <iostream> 
#include <vector> 

using boost::asio::ip::tcp; 

// A reference-counted non-modifiable buffer class. 
class shared_const_buffer 
{ 
public: 
    // Construct from a std::string. 
    explicit shared_const_buffer(const std::string& data) 
    : data_(new std::vector<char>(data.begin(), data.end())), 
     buffer_(boost::asio::buffer(*data_)) 
    { 
    } 

    // Implement the ConstBufferSequence requirements. 
    typedef boost::asio::const_buffer value_type; 
    typedef const boost::asio::const_buffer* const_iterator; 
    const boost::asio::const_buffer* begin() const { return &buffer_; } 
    const boost::asio::const_buffer* end() const { return &buffer_ + 1; } 

private: 
    boost::shared_ptr<std::vector<char> > data_; 
    boost::asio::const_buffer buffer_; 
}; 

class session 
    : public boost::enable_shared_from_this<session> 
{ 
public: 
    session(boost::asio::io_service& io_service) 
    : socket_(io_service) 
    { 
    } 

    tcp::socket& socket() 
    { 
    return socket_; 
    } 

    void start() 
    { 
    using namespace std; // For time_t, time and ctime. 
    time_t now = time(0); 
    shared_const_buffer buffer(ctime(&now)); 
    boost::asio::async_write(socket_, buffer, 
     boost::bind(&session::handle_write, shared_from_this())); 
    } 

    void handle_write() 
    { 
    } 

private: 
    // The socket used to communicate with the client. 
    tcp::socket socket_; 
}; 

typedef boost::shared_ptr<session> session_ptr; 

class server 
{ 
public: 
    server(boost::asio::io_service& io_service, short port) 
    : io_service_(io_service), 
     acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) 
    { 
    session_ptr new_session(new session(io_service_)); 
    acceptor_.async_accept(new_session->socket(), 
     boost::bind(&server::handle_accept, this, new_session, 
      boost::asio::placeholders::error)); 
    } 

    void handle_accept(session_ptr new_session, 
     const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     new_session->start(); 
     new_session.reset(new session(io_service_)); 
     acceptor_.async_accept(new_session->socket(), 
      boost::bind(&server::handle_accept, this, new_session, 
      boost::asio::placeholders::error)); 
    } 
    } 

private: 
    boost::asio::io_service& io_service_; 
    tcp::acceptor acceptor_; 
}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 2) 
    { 
     std::cerr << "Usage: reference_counted <port>\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    using namespace std; // For atoi. 
    server s(io_service, atoi(argv[1])); 

    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 

如这里要求是错误的巨块:

/tmp/ccvtengY.o: In function `__static_initialization_and_destruction_0(int, int)': 
example.cpp:(.text+0x182): undefined reference to `boost::system::generic_category()' 
example.cpp:(.text+0x18e): undefined reference to `boost::system::generic_category()' 
example.cpp:(.text+0x19a): undefined reference to `boost::system::system_category()' 
/tmp/ccvtengY.o: In function `boost::system::error_code::error_code()': 
example.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x17): undefined reference to `boost::system::system_category()' 
/tmp/ccvtengY.o: In function `boost::asio::error::get_system_category()': 
example.cpp:(.text._ZN5boost4asio5error19get_system_categoryEv[boost::asio::error::get_system_category()]+0x5): undefined reference to `boost::system::system_category()' 
/tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr_create(unsigned int&)': 
example.cpp:(.text._ZN5boost4asio6detail20posix_tss_ptr_createERj[boost::asio::detail::posix_tss_ptr_create(unsigned int&)]+0x19): undefined reference to `pthread_key_create' 
/tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::~posix_tss_ptr()': 
example.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete' 
/tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::operator boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*() const': 
example.cpp:(.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev[boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::operator boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*() const]+0x15): undefined reference to `pthread_getspecific' 
/tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::~posix_tss_ptr()': 
example.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete' 
/tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::operator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*)': 
example.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_[boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::operator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*)]+0x20): undefined reference to `pthread_setspecific' 
collect2: ld returned 1 exit status 
+0

你得到什么错误? –

+0

@BrendanLong发表。 – sj755

回答

8

它编译罚款我g++ -lboost_system-mt -pthread

+1

它的作品!你怎么知道使用这个特定的链接? – sj755

+1

我知道我需要Boost,而且我知道我正在编译多线程。 Boost的文档说为多线程代码使用'-lboost_system-mt',并且我的发行版的文档说使用'-pthread'来支持POSIX pthread。但是,如果你不知道这一点,你可以使用'nm'或'strings'来找到你需要的符号库。 –

+0

nm?字符串?不知道你所指的这些工具是什么... – sj755

0

看起来您可能需要在构建时明确包含boost库路径。你的确切构建命令是什么?在命令中是否有类似-L/usr/lib/boost的内容?

+0

没有这样的目录... – sj755

1

对于联Boost库的列表:

for f in $(ls -1 /usr/lib64/libboost_*.a); do basename $f .a | cut -c 4-99; done;