Неопределенный справочный вопрос

Я получаю эту ошибку на С++, и я действительно не знаю, как добраться до сути:

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

/tmp/ccUHa2s3.o: В функции `main': proxy.cpp:(.text+0x1d8): неопределенная ссылка на `server::server(std::deque<boost::shared_ptr<boost::asio::io_service>, std::allocator<boost::shared_ptr<boost::asio::io_service> > > const&, int)' collect2: ld вернул 1 статус выхода

У меня есть следующий исходный код (который я скопировал с 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();
    }
}

Может ли кто-нибудь указать мне правильное направление, как исправить эту ошибку?


Редактировать

Теперь я получаю следующую ошибку:

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

/tmp/ccl3DHn7.o: В функции `server::handle_accept(boost::shared_ptr<connection>, boost::system::error_code const&)': proxy-server.cpp:(.text+0x250): неопределенная ссылка на `connection::start()' /tmp/ccl3DHn7.o: В функции `connection::create(boost::asio::io_service&)': proxy-server.cpp :(.text._ZN10connection6createERN5boost4asio10io_serviceE[connection::create(boost::asio::io_service&)]+0x29): неопределенная ссылка на `connection::connection(boost::asio::io_service&)' collect2: ld вернул 1 статус выхода`


person Eamorr    schedule 19.08.2011    source источник
comment
Пожалуйста, прекратите писать теги в заголовках и сопровождать вопросы лишними приветствиями/спасибо/подписями. Вы пишете вопрос, а не письмо, не доску объявлений или сообщение в чате!   -  person Lightness Races in Orbit    schedule 19.08.2011
comment
Почему вы продолжаете редактировать свой вопрос, чтобы нарушить форматирование? Останови это.   -  person Lightness Races in Orbit    schedule 19.08.2011
comment
Извините, меня смутил интерфейс.   -  person Eamorr    schedule 19.08.2011


Ответы (2)


Это означает, что он не может найти реализацию конструктора server. Вы написали тот, который вы не показываете выше?

EDIT: Итак, вы написали его, но не передаете его компилятору. Вы должны иметь proxy-server.cpp в строке g++.

EDIT 2: недостаточно просто скомпилировать файл, содержащий main, и включить заголовочные файлы. Вам необходимо предоставить все файлы cpp для g++, иначе он не сможет связать вашу программу.

g++ proxy.cpp proxy-server.cpp proxy-conn.cpp -lboost_thread -lboost_filesystem -lboost_system
person carlpett    schedule 19.08.2011
comment
Отредактированный пост для включения proxy-server.cpp - person Eamorr; 19.08.2011
comment
+1: это правильный ответ. Извини, Ним; не твоя вина; это просто то, как ОП пошло не так! - person Lightness Races in Orbit; 19.08.2011
comment
@Tomalak, не нужно извинений, я тоже проголосовал за это ... Я упомянул, что не скомпилировано и не связано, но не так явно, как это ... - person Nim; 19.08.2011
comment
@carlpett Спасибо за это. Я пытался скомпилировать, но теперь я получаю другую ошибку. Пожалуйста, смотрите мой отредактированный пост. Большое спасибо, - person Eamorr; 19.08.2011
comment
Я предполагаю, что заголовок proxy-conn.hpp имеет соответствующий заголовок proxy-conn.cpp? В этом случае вам нужно добавить и это: g++ proxy.cpp proxy-server.cpp -lboost_thread -lboost_filesystem -lboost_system. Если у вас есть какие-либо другие файлы cpp, вам, вероятно, нужно добавить их туда же. - person carlpett; 19.08.2011
comment
Ну, это та же ошибка, не так ли. Глядя на код, я бы предположил, что вам также нужно включить proxy-conn.cpp в командной строке. Вам необходимо включить все файлы cpp, которые вы хотите скомпилировать, в командной строке. - person john; 19.08.2011
comment
@carlpett - это именно то, что было. Мне также пришлось добавить -lboost_regex на всякий случай! Большое спасибо! - person Eamorr; 19.08.2011
comment
@john - что именно делает включение всех файлов cpp в одну команду? - person Eamorr; 19.08.2011
comment
@Eamorr, к сожалению, я не думаю, что смогу достаточно хорошо объяснить процесс, но некоторые поисковые запросы дали эту ссылку (acm.uiuc.edu/sigmil/RevEng/ch02.html), который, кажется, достаточно хорошо описывает это. - person carlpett; 19.08.2011
comment
@Earnoor: он их компилирует. Не обязательно делать все сразу. Если у вас очень много файлов cpp, вы можете скомпилировать их по одному, а затем связать их вместе в конце. Но так или иначе вам нужно скомпилировать весь ваш исходный код. - person john; 19.08.2011

Из ошибки довольно ясно, что вы объявили конструктор для server, но определение недоступно (либо не скомпилировано и не связано, либо вообще не предоставлено)

Вам нужно определить его в файле cpp.

person Nim    schedule 19.08.2011
comment
Привет, большое спасибо за ответ. Но я включаю proxy-server.hpp в proxy.cpp. proxy-server.hpp имеет класс с именем сервер - person Eamorr; 19.08.2011
comment
Да, есть объявленный конструктор с именем server(), но это просто объявление. Реализация недоступна... - person Nim; 19.08.2011
comment
@Nim: В вашем комментарии запутанная терминология, потому что функции не определены. Определение функции является реализацией функции. Определение класса по существу не имеет значения; все, что он здесь делает, это содержит функцию declarations. - person Lightness Races in Orbit; 19.08.2011
comment
@Nim: Все еще сбивает с толку, потому что класс определен. Я бы вообще не стал говорить о классе. - person Lightness Races in Orbit; 19.08.2011