0
votes

I'm getting this error in C++ and I really don't know how to get to the bottom of it:

g++ proxy.cpp -lboost_thread -lboost_filesystem -lboost_system

/tmp/ccUHa2s3.o: In function `main': proxy.cpp:(.text+0x1d8): undefined reference to `server::server(std::deque<boost::shared_ptr<boost::asio::io_service>, std::allocator<boost::shared_ptr<boost::asio::io_service> > > const&, int)' collect2: ld returned 1 exit status

I have the following source code (which I copied off http://alexott.net/common/asio-proxy-async/proxy-conn.cpp.html):

//proxy.cpp:
#include "proxy-server.hpp"

int main(int argc, char** argv) {
    try {
        int thread_num=2;
        if(argc > 1)
            thread_num=boost::lexical_cast<int>(argv[1]);
        ios_deque io_services;
        std::deque<ba::io_service::work> io_service_work;

        boost::thread_group thr_grp;

        for (int i = 0; i < thread_num; ++i) {
            io_service_ptr ios(new ba::io_service);
            io_services.push_back(ios);
            io_service_work.push_back(ba::io_service::work(*ios));
            thr_grp.create_thread(boost::bind(&ba::io_service::run, ios));
        }
        server server(io_services);   //apparently there's some error here?
        thr_grp.join_all();
    } catch (std::exception& e) {
        std::cerr << e.what() << std::endl;
    }


    return 0;
}



//proxy-server.hpp:
#ifndef _PROXY_SERVER_H
#define _PROXY_SERVER_H 1

#include "common.h"
#include "proxy-conn.hpp"

#include <deque>

typedef std::deque<io_service_ptr> ios_deque;

class server {
public:
    server(const ios_deque& io_services, int port=10001);

private:
    void start_accept();
    void handle_accept(connection::pointer new_connection, const bs::error_code& error);

    ios_deque io_services_;
    ba::ip::tcp::acceptor acceptor_;
};


#endif /* _PROXY-SERVER_H */


//proxy-server.cpp:
#include "proxy-server.hpp"

server::server(const ios_deque& io_services, int port)
    : io_services_(io_services),
      acceptor_(*io_services.front(), ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port)) {
    start_accept();
}

void server::start_accept() {
    // Round robin.
    io_services_.push_back(io_services_.front());
    io_services_.pop_front();
    connection::pointer new_connection = connection::create(*io_services_.front());

    acceptor_.async_accept(new_connection->socket(),
                           boost::bind(&server::handle_accept, this, new_connection,
                                       ba::placeholders::error));
}

void server::handle_accept(connection::pointer new_connection, const bs::error_code& error) {
    if (!error) {
        new_connection->start();
        start_accept();
    }
}

Can someone please point me in the right direction as to how to fix this error?


Edit

I now get the following error:

g++ proxy.cpp proxy-server.cpp -lboost_thread -lboost_filesystem -lboost_system

/tmp/ccl3DHn7.o: In function `server::handle_accept(boost::shared_ptr<connection>, boost::system::error_code const&)': proxy-server.cpp:(.text+0x250): undefined reference to `connection::start()' /tmp/ccl3DHn7.o: In function `connection::create(boost::asio::io_service&)': proxy-server.cpp:(.text._ZN10connection6createERN5boost4asio10io_serviceE[connection::create(boost::asio::io_service&)]+0x29): undefined reference to `connection::connection(boost::asio::io_service&)' collect2: ld returned 1 exit status`

2
Please stop writing tags in your titles and trailing your questions with redundant greetings/thanks/signatures. You are writing a question, not a letter, not a message board or "chat" post!Lightness Races in Orbit
Why do you keep editing your question to break the formatting? Stop it.Lightness Races in Orbit
Sorry, I got confused by the interface there.Eamorr

2 Answers

5
votes

It means it cannot find the implementation of the server constructor. Have you written one which you do not show above?

EDIT: Ok, so you've written one, but you're not passing it to the compiler. You need to have proxy-server.cpp in your g++ line.

EDIT 2: It is not enough to just compile the file containing main and include the header files. You need to provide all the cpp files to g++, or it will not be able to link your program.

g++ proxy.cpp proxy-server.cpp proxy-conn.cpp -lboost_thread -lboost_filesystem -lboost_system
2
votes

It's pretty clear from the error, you've declared the constructor for server, but the definition is not available (either not compiled and linked in, or not provided at all)

You need to define it in your cpp file.