开发者

Undefined reference question

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`


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


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜