title: Compile Boost Program
body: <p>I'm having trouble understanding the basics of compiling a boost program. I'm working with Fedora 15, with boost installed through yum in /usr/include/boost. I have boost build installed as well.</p>
  
  <p>I'd really like to know how to link with the boost library and compile the following example under the terminal, and with boost-jam/build.</p>
  
  <pre><code>//
  // 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 &lt;boost/asio.hpp&gt;
  #include &lt;boost/bind.hpp&gt;
  #include &lt;boost/enable_shared_from_this.hpp&gt;
  #include &lt;boost/shared_ptr.hpp&gt;
  #include &lt;iostream&gt;
  #include &lt;vector&gt;
  
  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&amp; data)
      : data_(new std::vector&lt;char&gt;(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 &amp;buffer_; }
    const boost::asio::const_buffer* end() const { return &amp;buffer_ + 1; }
  
  private:
    boost::shared_ptr&lt;std::vector&lt;char&gt; &gt; data_;
    boost::asio::const_buffer buffer_;
  };
  
  class session
    : public boost::enable_shared_from_this&lt;session&gt;
  {
  public:
    session(boost::asio::io_service&amp; io_service)
      : socket_(io_service)
    {
    }
  
    tcp::socket&amp; socket()
    {
      return socket_;
    }
  
    void start()
    {
      using namespace std; // For time_t, time and ctime.
      time_t now = time(0);
      shared_const_buffer buffer(ctime(&amp;now));
      boost::asio::async_write(socket_, buffer,
          boost::bind(&amp;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&lt;session&gt; session_ptr;
  
  class server
  {
  public:
    server(boost::asio::io_service&amp; 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-&gt;socket(),
          boost::bind(&amp;server::handle_accept, this, new_session,
            boost::asio::placeholders::error));
    }
  
    void handle_accept(session_ptr new_session,
        const boost::system::error_code&amp; error)
    {
      if (!error)
      {
        new_session-&gt;start();
        new_session.reset(new session(io_service_));
        acceptor_.async_accept(new_session-&gt;socket(),
            boost::bind(&amp;server::handle_accept, this, new_session,
              boost::asio::placeholders::error));
      }
    }
  
  private:
    boost::asio::io_service&amp; io_service_;
    tcp::acceptor acceptor_;
  };
  
  int main(int argc, char* argv[])
  {
    try
    {
      if (argc != 2)
      {
        std::cerr &lt;&lt; "Usage: reference_counted &lt;port&gt;\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&amp; e)
    {
      std::cerr &lt;&lt; "Exception: " &lt;&lt; e.what() &lt;&lt; "\n";
    }
  
    return 0;
  }
  </code></pre>
  
  <p>As requested here is the giant block of error:</p>
  
  <pre><code>/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&amp;)':
  example.cpp:(.text._ZN5boost4asio6detail20posix_tss_ptr_createERj[boost::asio::detail::posix_tss_ptr_create(unsigned int&amp;)]+0x19): undefined reference to `pthread_key_create'
  /tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context&gt;::~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&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context&gt;::operator boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context*() const':
  example.cpp:(.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev[boost::asio::detail::posix_tss_ptr&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context&gt;::operator boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context*() const]+0x15): undefined reference to `pthread_getspecific'
  /tmp/ccvtengY.o: In function `boost::asio::detail::posix_tss_ptr&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::strand_service::strand_impl&gt;::context&gt;::~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&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context&gt;::operator=(boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context*)':
  example.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_[boost::asio::detail::posix_tss_ptr&lt;boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context&gt;::operator=(boost::asio::detail::call_stack&lt;boost::asio::detail::task_io_service&gt;::context*)]+0x20): undefined reference to `pthread_setspecific'
  collect2: ld returned 1 exit status
  </code></pre>