LINUX.ORG.RU

После обновления системы перестал компилироваться проект, выдает «undefined reference to vtable for MyClass»

 


1

2

После обновления системы перестал компилироваться проект, выдает «undefined reference to vtable for MyClass», MyClass производный от QObject. В проекте несколько классов производных от QObject, но ругается только на один. Я даже попробовал откатить проект на предыдущую версию, там то же ошибка.

Операционка Ubuntu 16.04 LTS,
компилятор g++-7 7.3.0,
компилируется из под QtCreator 4.3.1.

Без кода малоинформативно.

IceRain
()

Версия библиотек Qt не изменилась?

SR_team ★★★★★
()

очистить (убедиться что все почистилось) и пересобрать весь проект пробовал?

dib2 ★★★★★
()
Ответ на: комментарий от dib2

очистить (убедиться что все почистилось) и пересобрать весь проект пробовал?

чистил, запускал qmake.

Версия библиотек Qt не изменилась?

Не знаю. Система сказал что хочет обновиться, я нажал. Хотела еще обновить вообще до 18 версии, я отказался от этого предложения.

Без кода малоинформативно.

У меня кода на несколько сотен кб. Даже не знаю куда подступиться. Линкер отсылает к конструктору-деструктору, но там уже несколько месяцев ничего не менялось.

victor79
() автор топика

Я при разработке на Qt использую версию из их установщика, установленную в /opt

rumgot ★★★★★
()
Ответ на: комментарий от IceRain

В новых gcc ужесточились проверки на деструкторы. Попробуй, отпишись...

IceRain
()
Ответ на: комментарий от IceRain

virtual ~MyClass() {}
virtual ~MyClass override {}

не помогает.

Я при разработке на Qt использую версию из их установщика, установленную в /opt

по умолчанию ставится пятая версия gcc, а она не поддерживает стандарт выше с++11.

victor79
() автор топика
Ответ на: комментарий от rumgot

Gcc будет из системы, Qt из /opt . Не очень понял проблему.

у меня папка /opt не содержит компилятора. Qt установлена в домашнюю папку, и по умолчанию использовала gcc операционки которая по умолчанию пятая.

victor79
() автор топика
Ответ на: комментарий от victor79

после того как совсем убрал явные конструктор и деструктор из класса, проблема осталась, но теперь ссылается на вызов new MyClass;

victor79
() автор топика

QtCreator 4.3.1 + gcc 7.3.0

Какой-то спец олимпиадой попахивает (использовать прилично более старую IDE с новым компилятором).

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)
  • Перезапустить qmake (или что там moc зовёт) из QtCreator-а.
  • Нажать «пересобрать проект»
  • Радоваться
robus ★★★★★
()
Ответ на: комментарий от robus

Перезапустить qmake (или что там moc зовёт) из QtCreator-а. Нажать «пересобрать проект» Радоваться

это уже пробовал.

Я даже попробовал создал новый пустой проект:

class MyClass : public QObject {
public:
    Q_OBJECT
};
...
MyClass* p = new MyClass;
при компиляции выдает: «undefined reference to `vtable for MyClass»

думаю теперь переустанавливать. Сначала ограничусь Qt и gcc.

victor79
() автор топика
Ответ на: комментарий от anonymous

емпин 16 идёт уже с pie, ибо начиная с гцц 6 pie уже дефолт

ничего не понял...

Класс в хедере объявлен? moc генерирует файл для класса?

я уже все по умолчанию сделал, и даже стандартный gcc включил, и сделал самый простой пример:

#include <QCoreApplication>

class MyClass : public QObject {
    Q_OBJECT
public:
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyClass* p = new MyClass;
    return a.exec();
}
какой тут нужен еще хедер или дополнительные moc? все равно выдает ошибку: undefined reference to `vtable for MyClass', что сломалось не понятно, вчера работало, сегодня с утра перестало, компьютер до обнаружения проблемы не перезагружался.

victor79
() автор топика
Ответ на: комментарий от victor79

тебе же говорят - деструктор запили.

class MyClass : public QObject {
    Q_OBJECT
public:
    virtual ~MyClass();
};

MyClass::~MyClass() {}
anonymous
()

А «обновлялся» по насущной необходимости?

oblfan
()
Ответ на: комментарий от unC0Rr

Просто так заглянул наогонёк? Этоже ошибка линкера! Уже всё скомпилялося.

2TS: в тред не вникал, но в таких случаях лучший метод - попробовать скомпилять вручную.

anonymous
()
Ответ на: комментарий от anonymous

C Qt не знаком? В том-то и дело, что moc генерирует код дополнительных методов, скрывающихся под макросом Q_OBJECT. Без них всё компилится прекрасно, само собой, но не линкуется.

unC0Rr ★★★★★
()
Последнее исправление: unC0Rr (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

#include «main.moc»

Никогда не использовал данный #include c QT. Ни в Linux, ни в Win.

И как это объясняет проблему ТС после обновления?

oblfan
()
Ответ на: комментарий от oblfan

Поломалось что-то, возможно даты, возможно сгенерированный файл потёрся или что-то ещё, что может сломаться. Бывает, что код на си/цпп компилится и работает, пока не удалишь объектники и не попытаешься скомпилить с нуля. Инклюд нужен только если ты пихаешь объявление наследника QObject в .cpp

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

C Qt не знаком? В том-то и дело, что moc генерирует код дополнительных методов, скрывающихся под макросом Q_OBJECT. Без них всё компилится прекрасно, само собой, но не линкуется.

Взял чистый диск, установил туда новую операционку, туда Qt, и снова та же ошибка на простом примере. Про moc файл, верно его включать не нужно, но он должен быть. А его у меня нет. В каталогах сборки он не появляется даже после нажатия «выполнить qmake».

victor79
() автор топика
Ответ на: комментарий от victor79

Все разобрался. Да, действительно, MyClass должен быть описан в хедер-файле. И тогда его описание попадает в moc файл. Осталось разобраться, почему у меня в проекте хедер-файл перестал считаться хедер-файлом, в том числе и в старых версиях, но это уже к теме не относится.

victor79
() автор топика
Ответ на: комментарий от victor79

В итоге обнаружил, что moc компилятор вылетал на кучке определений #define, и испортилось это давно, а мок файл не перестраивался. А когда я решил откомпилить это с очисткой, тогда оно и перестало работать. Эти дефайны вынес в отдельный хедер файл и все заработало.

victor79
() автор топика
Ответ на: комментарий от IceRain

Макросы - очень большое зло!

Ассерты пока что реализованы через макросы, а так же получение файла/строки точки вызова блока если нужные то только в макросах. Приходится мириться с этим злом.

victor79
() автор топика
21 ноября 2019 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.