Boost web client error (newbee)

X

Xan

Hi,

I'm a newbee of C++. I want to make a web client with boost libraries.
I have ubuntu (libboost1.46-dev) and I follow the example that appear
in boost web page:

#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

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

class client
{
public:
client(boost::asio::io_service& io_service,
const std::string& server, const std::string& path)
: resolver_(io_service),
socket_(io_service)
{
// Form the request. We specify the "Connection: close" header so
that the
// server will close the socket after transmitting the response.
This will
// allow us to treat all data up until the EOF as the content.
std::eek:stream request_stream(&request_);
request_stream << "GET " << path << " HTTP/1.0\r\n";
request_stream << "Host: " << server << "\r\n";
request_stream << "Accept: */*\r\n";
request_stream << "Connection: close\r\n\r\n";

// Start an asynchronous resolve to translate the server and
service names
// into a list of endpoints.
tcp::resolver::query query(server, "http");
resolver_.async_resolve(query,
boost::bind(&client::handle_resolve, this,
boost::asio::placeholders::error,
boost::asio::placeholders::iterator));
}

private:
void handle_resolve(const boost::system::error_code& err,
tcp::resolver::iterator endpoint_iterator)
{
if (!err)
{
// Attempt a connection to the first endpoint in the list. Each
endpoint
// will be tried until we successfully establish a connection.
tcp::endpoint endpoint = *endpoint_iterator;
socket_.async_connect(endpoint,
boost::bind(&client::handle_connect, this,
boost::asio::placeholders::error, ++endpoint_iterator));
}
else
{
std::cout << "Error: " << err.message() << "\n";
}
}

void handle_connect(const boost::system::error_code& err,
tcp::resolver::iterator endpoint_iterator)
{
if (!err)
{
// The connection was successful. Send the request.
boost::asio::async_write(socket_, request_,
boost::bind(&client::handle_write_request, this,
boost::asio::placeholders::error));
}
else if (endpoint_iterator != tcp::resolver::iterator())
{
// The connection failed. Try the next endpoint in the list.
socket_.close();
tcp::endpoint endpoint = *endpoint_iterator;
socket_.async_connect(endpoint,
boost::bind(&client::handle_connect, this,
boost::asio::placeholders::error, ++endpoint_iterator));
}
else
{
std::cout << "Error: " << err.message() << "\n";
}
}

void handle_write_request(const boost::system::error_code& err)
{
if (!err)
{
// Read the response status line. The response_ streambuf will
// automatically grow to accommodate the entire line. The growth
may be
// limited by passing a maximum size to the streambuf
constructor.
boost::asio::async_read_until(socket_, response_, "\r\n",
boost::bind(&client::handle_read_status_line, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "Error: " << err.message() << "\n";
}
}

void handle_read_status_line(const boost::system::error_code& err)
{
if (!err)
{
// Check that response is OK.
std::istream response_stream(&response_);
std::string http_version;
response_stream >> http_version;
unsigned int status_code;
response_stream >> status_code;
std::string status_message;
std::getline(response_stream, status_message);
if (!response_stream || http_version.substr(0, 5) != "HTTP/")
{
std::cout << "Invalid response\n";
return;
}
if (status_code != 200)
{
std::cout << "Response returned with status code ";
std::cout << status_code << "\n";
return;
}

// Read the response headers, which are terminated by a blank
line.
boost::asio::async_read_until(socket_, response_, "\r\n\r\n",
boost::bind(&client::handle_read_headers, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "Error: " << err << "\n";
}
}

void handle_read_headers(const boost::system::error_code& err)
{
if (!err)
{
// Process the response headers.
std::istream response_stream(&response_);
std::string header;
while (std::getline(response_stream, header) && header != "\r")
std::cout << header << "\n";
std::cout << "\n";

// Write whatever content we already have to output.
if (response_.size() > 0)
std::cout << &response_;

// Start reading remaining data until EOF.
boost::asio::async_read(socket_, response_,
boost::asio::transfer_at_least(1),
boost::bind(&client::handle_read_content, this,
boost::asio::placeholders::error));
}
else
{
std::cout << "Error: " << err << "\n";
}
}

void handle_read_content(const boost::system::error_code& err)
{
if (!err)
{
// Write all of the data that has been read so far.
std::cout << &response_;

// Continue reading remaining data until EOF.
boost::asio::async_read(socket_, response_,
boost::asio::transfer_at_least(1),
boost::bind(&client::handle_read_content, this,
boost::asio::placeholders::error));
}
else if (err != boost::asio::error::eof)
{
std::cout << "Error: " << err << "\n";
}
}

tcp::resolver resolver_;
tcp::socket socket_;
boost::asio::streambuf request_;
boost::asio::streambuf response_;
};

int main(int argc, char* argv[])
{
try
{
if (argc != 3)
{
std::cout << "Usage: async_client <server> <path>\n";
std::cout << "Example:\n";
std::cout << " async_client www.boost.org /LICENSE_1_0.txt\n";
return 1;
}

boost::asio::io_service io_service;
client c(io_service, argv[1], argv[2]);
io_service.run();
}
catch (std::exception& e)
{
std::cout << "Exception: " << e.what() << "\n";
}

return 0;
}


but I receive these errors:


/tmp/cc-u4FMYi.o: In function `__cxx_global_var_init1':
b.cpp:(.text+0x57): undefined reference to
`boost::system::generic_category()'
/tmp/cc-u4FMYi.o: In function `__cxx_global_var_init2':
b.cpp:(.text+0x77): undefined reference to
`boost::system::generic_category()'
/tmp/cc-u4FMYi.o: In function `__cxx_global_var_init3':
b.cpp:(.text+0x97): undefined reference to
`boost::system::system_category()'
/tmp/cc-u4FMYi.o: In function
`boost::asio::error::get_system_category()':
b.cpp:
(.text._ZN5boost4asio5error19get_system_categoryEv[_ZN5boost4asio5error19get_system_categoryEv]
+0x7): undefined reference to `boost::system::system_category()'
/tmp/cc-u4FMYi.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()':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev]
+0x18): undefined reference to `pthread_key_delete'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_tss_ptr_create(unsigned int&)':
b.cpp:
(.text._ZN5boost4asio6detail20posix_tss_ptr_createERj[_ZN5boost4asio6detail20posix_tss_ptr_createERj]
+0x33): undefined reference to `pthread_key_create'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::~posix_tss_ptr()':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEED2Ev]
+0x18): undefined reference to `pthread_key_delete'
/tmp/cc-u4FMYi.o: In function
`boost::system::error_code::error_code()':
b.cpp:
(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC2Ev]
+0x19): undefined reference to `boost::system::system_category()'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::eek:perator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*)':
b.cpp:
(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEaSEPS6_]
+0x22): undefined reference to `pthread_setspecific'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context>::eek:perator
boost::asio::detail::call_stack<boost::asio::detail::task_io_service>::context*()
const':
b.cpp:
(.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev[_ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceEE7contextEEcvPS6_Ev]
+0x15): undefined reference to `pthread_getspecific'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_thread::start_thread(boost::asio::detail::posix_thread::func_base*)':
b.cpp:
(.text._ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE[_ZN5boost4asio6detail12posix_thread12start_threadEPNS2_9func_baseE]
+0x3b): undefined reference to `pthread_create'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_thread::~posix_thread()':
b.cpp:
(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD2Ev]
+0x2c): undefined reference to `pthread_detach'
/tmp/cc-u4FMYi.o: In function
`boost::asio::detail::posix_thread::join()':
b.cpp:
(.text._ZN5boost4asio6detail12posix_thread4joinEv[_ZN5boost4asio6detail12posix_thread4joinEv]
+0x3c): undefined reference to `pthread_join'
clang: error: linker command failed with exit code 1 (use -v to see
invocation)



What can I do?
This bunch of errors overpasses me ;-)

Thanks in advance,
Xan.
 
V

Victor Bazarov

I'm a newbee of C++. I want to make a web client with boost libraries.
I have ubuntu (libboost1.46-dev) and I follow the example that appear
in boost web page:

[...code...]

but I receive these errors:


/tmp/cc-u4FMYi.o: In function `__cxx_global_var_init1':
b.cpp:(.text+0x57): undefined reference to
`boost::system::generic_category()'
[...more errors...]


What can I do?
This bunch of errors overpasses me ;-)

Do what I do in a situation like this (when there are too many errors):
deal with the first one and compile again. Undefined reference is most
likely due to the inability of your linker to locate the library where
the symbol is defined. Did you give the compiler the location of the
library where boost parts live? If you did, check it. If you didn't,
try again.

In general those things are not mistakes you made in your C++ code, but
mistakes in installing some third-party components or mistakes in using
the tools (the compiler in our case). Both are pretty much off-topic
here. So, make sure you install Boost correctly and tell the compiler
where your installation of Boost is. How? I don't know. It's actually
beyond the scope of comp.lang.c++

Good luck!

V
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,931
Messages
2,570,085
Members
46,536
Latest member
keelop

Latest Threads

Top