LINUX.ORG.RU

Ошибка при сборки qt

 ,


0

1

Привет.

Добавил класс

#ifndef MYTHREADBALANCER_H
#define MYTHREADBALANCER_H

#include<QThread>

class MyThreadBalancer : public QThread
{
    Q_OBJECT
public:
    explicit MyThreadBalancer(QObject *parent = 0);
    void run();
    bool Stop;
signals:
    void NumberChanged();
public slots:
};

#endif // MYTHREADBALANCER_H

#include "mythreadbalancer.h"
#include<QtCore>

MyThreadBalancer::MyThreadBalancer(QObject *parent) :
   QThread(parent)
{

}


void MyThreadBalancer::run()
{

}

Получаю ошибку при сборки: error: undefined reference to `vtable for MyThreadBalancer'

Показывай, как собираешь.

// А ещё стоит дописывать ключевое слово virtual к виртуальным методам, да и override не помешает

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)

При первом появлении Q_OBJECT в файле надо qmake перезапускать, кажется. Иначе moc не выполняет дополнительную обработку на этом файле.

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

Clear All затем Build All пробовал?

В *.pro файле в секции HEADERS имеется mythreadbalancer.h, а в секции SOURCES имеется mythreadbalancer.cpp ?

EXL ★★★★★
()
Ответ на: комментарий от Alex_Golubev
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Tion-pro28
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mainwindow.cpp \
    menu_1.cpp \
    graphwindow.cpp \
    edited.cpp \
    SoftKeyBoardContext.cpp \
    SoftKeyBoard.cpp \
    manualsetting.cpp \
    upgradefirmware.cpp \
    settings.cpp \
    mythreadbalancer.cpp

HEADERS  += mainwindow.h \
    menu_1.h \
    graphwindow.h \
    edited.h \
    SoftKeyBoardContext.h \
    SoftKeyBoard.h \
    manualsetting.h \
    upgradefirmware.h \
    settings.h \
    mythreadbalancer.h

FORMS    += mainwindow.ui \
    menu_1.ui \
    graphwindow.ui \
    edited.ui \
    SoftKeyBoard.ui \
    manualsetting.ui \
    upgradefirmware.ui \
    settings.ui

CONFIG += serialport

CONFIG += qwt

LIBS += -lmodbus

target.path = /home/root
INSTALLS += target
Alex_Golubev
() автор топика
Ответ на: комментарий от Alex_Golubev

Пальцем в небо, добавленный в хедер виртуальный деструктор не поможет?

public:
    virtual ~MyThreadBalancer() {};
EXL ★★★★★
()
Ответ на: комментарий от Alex_Golubev

Странный баг у тебя какой-то.

Добавил твой класс в минимальный пример – всё компилируется как на Qt 5, так и на Qt 4.

http://esxi.z-lab.me:666/~exl_lab/others/CheckClass.zip

Попробуй, у тебя этот минимальный пример будет компилироваться? Если да, ищи где у тебя проблема. Я бы начал с ручного удаления всей директории сборки…

Ошибка такая возникает если убрать из секции HEADERS в *.pro-файле хедер.

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

У меня твой проект собирается. Только в mythreadbalancer.h поменял class MyThreadBalancer : public QObject на class MyThreadBalancer : public QThread, как у тебя в заглавном сообщении темы.

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

Clear All&Build All вроде не запускает qmake, если проект уже сгенерирован, для этого есть отдельный пункт меню Run qmake.

xaizek ★★★★★
()

Получаю ошибку при сборки: error: undefined reference to `vtable for MyThreadBalancer'

В процессе сборки должны образоваться файлы moc_mythreadbalancer.cpp и moc_mythreadbalancer.o, последний должен быть слинкован в финальное приложение. Собираются ли эти файлы? А вообще, Makefile в студию

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

Такой трюк мог бы сработать только если деструтктор объявить до Q_OBJECT. Правда в результате, скорее всего, будут другие недостающие символы, так что это не решение.

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

При Build All и Rebuild All запускается, если конфигурация изменилась:

13:09:13: Starting: "/usr/bin/qmake" /home/exl/Downloads/Tion-pro28/Tion-pro28.pro -spec linux-g++ CONFIG+=qtquickcompiler
Info: creating stash file /home/exl/Downloads/build-Tion-pro28-Desktop-Release/.qmake.stash
13:09:13: The process "/usr/bin/qmake" exited normally.

Иначе:

13:07:21: Configuration unchanged, skipping qmake step.
EXL ★★★★★
()
Ответ на: комментарий от deep-purple

Зачем? Он что, без указания стандарта какое-то своё значение подставляет? Современные компиляторы ведь уже давно C++11 по умолчанию используют

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

При первом появлении Q_OBJECT в файле надо qmake перезапускать, кажется

Оно само отслеживает по filemtime какие файлы менялись и пересобирает только затронутые цепочки инклюдов, в том числе и мокает только изменившееся, что значительно уменьшает время сборки после правок/добавлений/удалений в коде.

Правда, это, возможно, не касается случая когда «Собираю нажатием кнопки Build all».

Я этими креаторами не пользуюсь, вообще. Пишу в любимых редакторах. Для пересборки вызываю скрипт, который перегенеривает *.pro файлы, причём для одного продукта их три (два бинаря и локализация) и дёргает лупдат или кумейк по каждому *.pro файлу.

deep-purple ★★★★★
()
Ответ на: комментарий от XMs

Зачем?

Затем, что можно получить сообщение «эта чо за override, дурак штоле?».

Современные компиляторы

Возможно, это ключевая фраза. Пока я явно не вписал «c++11», на разных машинах при сборке вполне себе бывала ситуация.

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

Оно само отслеживает по filemtime какие файлы менялись и пересобирает только затронутые цепочки инклюдов, в том числе и мокает только изменившееся, что значительно уменьшает время сборки после правок/добавлений/удалений в коде.

Я знаю, как работает make. Но список файлов для моканья зашивается на этапе генерации Makefile. И если сначала добавить файл, перегенерировать Makefile и потом вписать в него Q_OBJECT, то moc для него вызываться не будет.

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

список файлов для моканья зашивается на этапе генерации Makefile

Гыыы... Походу у меня такой проблемы нет — при перегенерации *.pro таки походу и Makefile перегенеривается. Не проверял, сейчас не под рукой.

UPD: А, ну конечно да.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.