2012-03-09 3 views
5

Я пытаюсь написать HTTP-прокси, который в основном работает как indianwebproxyнеопределенная ссылка на таблицу для ...

Так я разжег QtCreator и, но один из моих классов не в состоянии компилировать с печально известной ошибкой: undefined reference to vtable for HttpProxyThreadBrowser. Я не могу понять, почему он это делает. Я прочитал аналогичные вопросы о Stackoverflow и, видимо, the problem is with undefined virtual methods that are not pure Но я не объявил никаких виртуальных функций. Вот мой класс

class HttpProxyThreadBrowser : public QThread 
{ 
public: 
    HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket browserSocket,QObject *parent = 0); 
    ~HttpProxyThreadBrowser(){}; 
    void run(); 

private: 
    QTcpSocket outgoingSocket; 
    QTcpSocket browserSocket; 

}; 

И я определяю класс здесь в pastebin так, чтобы не утомлять вас. К сожалению, я не знаю, почему vtable не определена. Пожалуйста помогите.

httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser 
collect2: ld returned 1 exit status 
+0

В соответствии с [документацией] (http://qt-project.org/doc/qt-4.8/qthread.html#run) запуск является защищенным членом, а не общедоступным. Я сомневаюсь, что это будет причиной вашей ошибки. – obmarg

+0

@obmarg: Это так, поскольку run является виртуальным, и он никогда не определял его. – PlasmaHH

+0

Mmmm ... Компиляция отлично. 4.7.4 + 4.8.0 на MinGw. Какую ОС/Qt ver вы используете? – Koying

ответ

4

Вы не можете скопировать QTcpSocket, так что это может привести к другим загадочным ошибкам, если вы попытаетесь передать их копией, а не адресом.

HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0); 

private: 
    QTcpSocket* outgoingSocket; 
    QTcpSocket* browserSocket; 

И полностью перекомпилировать ваш проект может помочь, когда вы изменяете файлы заголовков, так как QMAKE генерируется Makefile иногда может не заметить изменения.

+1

Другим решением является передача QTcpSocket по ссылке, то есть HttpProxyThreadBrowser (QTcpSocket & outgoingSocket, QTcpSocket и browserSocket, QObject * parent = 0); – Koying

+0

Спасибо, много парней. Но это заставляет меня задаться вопросом, почему я не могу скопировать QTcpSockets, но это история на другой день. –

3

Это часто вызвано не связыванием файлов, генерируемых automoc.

Во-первых, вам нужно запустить automoc в заголовках, где определены классы с использованием Q_OBJECT, в вашем случае «httpproxythreadbrowser.h». Это создаст файл «* .moc».

Теперь есть два общих подхода, как продолжить. Либо вы можете # включить файл .moc в конец вашего .cpp-файла с определением класса, либо передать его компилятору в качестве исходного файла.

10

Деструктор неявно virtual, потому что базовый класс имеет виртуальный дур.

Компилятор GNU испускает vtable вместе с первым не встроенным виртуальным методом («ключ-метод»). Поскольку ваш d'tor определен внутри класса, он неявно является виртуальным, и поскольку других виртуальных методов нет, у вас нет ключевого метода.

Не существует случая, когда конкретный класс будет иметь только виртуальные встроенные методы, поскольку они могут быть встроены только в производные классы.

Я бы переместил определение dtor в файл реализации.

Я не уверен, что вам нужно использовать moc здесь, или если QThread деривативы работают без (IIRC вам это нужно только для операторов Qt-cast, а также для сигналов/слотов).

7

У меня также была ошибка undefined reference to vtable и последовал за шагами в Undefined reference to vtable... Q_OBJECT macro, которые посоветовали мне запустить qmake и ... это сработало!

+0

Спасибо! Ты спас мне жизнь! –

Смежные вопросы