C++: undefined reference to `vtable (ошибка при линковке)

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

C++: undefined reference to `vtable

Сообщение IMB »

Доброго дня!
Имеется класс Capture, базовым для него является класс Thread, доступ public.

Код: Выделить всё

BaseThread<Thread> *bthread;
Thread()
            :stop_flag(false)
            ,bthread(new BaseThread<Thread>())
        {
        }

        virtual ~Thread() {delete(bthread);}

При компиляции следующая ошибка:

Код: Выделить всё

capture.o: In function `~Thread':
/home/kirill/IP355/source/camera/thread.hpp:21: undefined reference to `vtable for Thread'
capture.o:(.rodata+0x358): undefined reference to `typeinfo for Thread'
capture.o: In function `Thread':
/home/kirill/IP355/source/camera/thread.hpp:19: undefined reference to `vtable for Thread'
collect2: ld returned 1 exit status
make: *** [camera] Error 1

В чём причина и как её решить?
Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

http://gcc.gnu.org/faq.html#vtables не?

Т.е. скорее всего в родительском для Thread классе есть объявленная не чисто виртуальная функция без реализации.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

У Thread нет родительского класса.
Что бы не загромождать, полный текст класса Thread приведён C++: потоки
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C++: undefined reference to `vtable

Сообщение watashiwa_daredeska »

Thread — не темплейтный класс, поэтому виртуальные (да и вообще все неинлайновые) методы в таких случаях, принято реализовывать в .cpp, а не в заголовке.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

Спасибо, но думаю, что это скорее относится к правилам "хорошего тона". Врядли реализация фукции в заголовочном файле объясняет ошибку линковки.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: C++: undefined reference to `vtable

Сообщение watashiwa_daredeska »

IMB писал(а):
15.06.2010 13:54
думаю, что это скорее относится к правилам "хорошего тона". Врядли реализация фукции в заголовочном файле объясняет ошибку линковки.
Что-то такое из далекого прошлого вспоминается, что это может быть проблемой.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

А можно ещё код Capture?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

Код: Выделить всё

#ifndef __CAPTURE_HPP__
#define __CAPTURE_HPP__

#include <iostream>

#include "config.hpp"
#include "thread.hpp"

#include <ti/sdo/dmai/Capture.h>
#include <ti/sdo/dmai/Framecopy.h>
#include <ti/sdo/dmai/Rendezvous.h>
#include <ti/sdo/dmai/Pause.h>
#include <ti/sdo/dmai/Fifo.h>

using std::cout;
using std::endl;

typedef struct Capture_Object {
    Int                  fd;
    Int16                userAlloc;
    Int16                started;
    Int32                topOffset;
    BufTab_Handle        hBufTab;
    VideoStd_Type        videoStd;
    struct _VideoBufDesc *bufDescs;
} Capture_Object;

class Capture : public Thread {
    unsigned int imageWidth;
    unsigned int imageHeight;
    unsigned int captureFormat;
    Rendezvous_Handle hRendezvousInit;
    Rendezvous_Handle hRendezvousCleanup;
    Pause_Handle hPauseProcess;
    Fifo_Handle hOutFifo;
    Fifo_Handle hInFifo;
    Framecopy_Handle hFramecopy;
    public:
        Capture();
        ~Capture() {cout << "Destroy Capture class!" << endl;}
        Fifo_Handle getInVideo(void) const {return hOutFifo;}
        Fifo_Handle getFromVideo(void) const {return hInFifo;}
        void run(void);
    private:
        Capture_Handle create(Capture_Attrs *attrs,
                              unsigned int width,
                              unsigned int height,
                              unsigned int format);
        void clear(void);
};

#endif //__CAPTURE_HPP__
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

А реализация Capture::run точно есть в природе?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

Да, приводить не хочу, так как большой.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

Только описание киньте без тела, оно не важно. Потому что пока другого не вижу, что бы так влияло %)
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

Просто, void run(void);
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

Я про:
void Capture::run(void) {...}
такое?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

Так я его и привёл.
В hpp-файле void run(void);, в cpp-файле void Capture::run(void){...}
Спасибо сказали:
math
Сообщения: 293
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: C++: undefined reference to `vtable

Сообщение math »

Если выложите архив с полными исходниками, могу попробовать помочь
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

Дошло, кажется. Хотя и не уверен.
run в дочернем классе объявлено в секции public, а должно в protected.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C++: undefined reference to `vtable

Сообщение IMB »

NickLion, спасибо за помощь, но не угадали.
Проблема была - "Сам дурак!", решил чуток "соптимизировать".
В оригинали фукция была объявлена так virtual void run(void) = 0, я подумал что она везде мне не понадобится и что бы её не переопределять сделал так virtual void run(void), да и забыл.
Результат все видели, правда механизм этих изменений мне не понятен, ну да глядишь и разберусь ;)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C++: undefined reference to `vtable

Сообщение NickLion »

IMB писал(а):
16.06.2010 09:19
В оригинали фукция была объявлена так virtual void run(void) = 0, я подумал что она везде мне не понадобится и что бы её не переопределять сделал так virtual void run(void), да и забыл.

А!... В таких случаях в конце {} надо, и тогда оптимизации боком не выйдут :)

IMB писал(а):
16.06.2010 09:19
Результат все видели, правда механизм этих изменений мне не понятен, ну да глядишь и разберусь ;)

Да механизм там простой. GCC если видит объявленную, но не реализованную не чисто виртуальную функцию, то просто сносит таблицу виртуальных функций. Это произошло из-за того, что поведение в таком случае в стандарте не описано. Сделали заглушку абы как, просто чтоб ошибка была. А сейчас уже никто переделывать не хочет - надо линкер переписывать для этого.
Спасибо сказали: