qt signal undefined reference error

31,339

Solution 1

At the beginning of your class declaration you should have the macro Q_OBJECT and be sure to inherit from some QObject descendant.

Solution 2

Apart from whatever is mentioned in this answer, also make sure to:

click 'Build' option > Run 'qmake'

That should fix the pending errors as well.

Share:
31,339
Amre
Author by

Amre

Updated on November 07, 2021

Comments

  • Amre
    Amre over 2 years

    I have a class server for which I have created a signal joined(QString name). I call it in a function called join(QString name), however I'm getting the error

    Server.o: In function Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Server::joined(QString)' collect2: ld returned 1 exit status

    This is what my header file looks like:

    #ifndef SERVER_H
    #define SERVER_H
    
    #include <QString>
    #include <mqueue.h>
    #include <QVector>
    #include <QStringList>
    #include "../src/messages.h"
    
    class Server
    {
    public:
        Server();
        void start();
    private:
        void join(QString name);
        char buf[MSG_SIZE], msgSend[MSG_SIZE];
        QVector<mqd_t> mq_external;
        QVector<QString> users;
        mqd_t mq_central;
        struct mq_attr attr;
    
    
    signals:
        void joined(QString name);
    
    };
    
    #endif // SERVER_H
    

    and this is my cpp file:

    #include "Server.h"
    
    using namespace std;
    
    Server::Server()
    {
    }
    
    void Server::start(){
    
        attr.mq_maxmsg = 100;
        attr.mq_msgsize = MSG_SIZE;
        attr.mq_flags = 0;
    
        mq_unlink(CENTRALBOX);
        mq_central = mq_open(CENTRALBOX, O_RDONLY | O_CREAT, S_IRWXU, &attr);
        while(1)
        {
            int tempMsgVal = mq_receive(mq_central, buf, MSG_SIZE, 0);
            if(tempMsgVal != -1){
                QString tempS = buf;
                QStringList tempSL = tempS.split(":");
                if(tempSL.size() == 2 && tempSL.at(0) == "started")
                {
                    int x = 0;
                    bool exists = false;
                    for(int i = 0; i < mq_external.size(); i++)
                    {
                        x = QString::compare(tempSL[1], users.at(i), Qt::CaseInsensitive);
                        if(x == 0)
                        {
                            exists = true;
                            break;
                        }
                    }
    
                    if(!exists)
                    {
                        sprintf(buf,"joined");
                        QString tempS1 = tempSL[1] + "new";
                        QByteArray byteArray = tempS1.toUtf8();
                        const char* tempr = byteArray.constData();
                        mqd_t tempMQ = mq_open(tempr, O_RDWR);
                        int tempI = mq_send(tempMQ, buf, strlen(buf), 0);
                    }
                    else
                    {
                        sprintf(buf,"invalidname");
                        QString tempS1 = tempSL[1] + "new";
                        QByteArray byteArray = tempS1.toUtf8();
                        const char* tempr = byteArray.constData();
                        mqd_t tempMQ = mq_open(tempr, O_RDWR);
                        int tempI = mq_send(tempMQ, buf, strlen(buf), 0);
                    }//Endelse
                }//Endif
            }//Endif
    
        }//Endwhile
    }
    
    void Server::join(QString name)
    {
        emit joined(name);
    }
    
  • Nikos C.
    Nikos C. over 11 years
    And also inherit from QObject, I think?
  • Amre
    Amre over 11 years
    I did it, but this time I'm getting an additional error "undefined reference to vtable for server" The beginning of my class now looks like this: class Server : public QObject { Q_OBJECT public: . . . } I even clean the project and did a rebuild all.
  • Nikos C.
    Nikos C. over 11 years
    @Amre Run "make distclean", and then "qmake" again. This will rebuild your Makefiles so that the moc rules are up to date. A "make clean" is not enough in this case.
  • osirisgothra
    osirisgothra over 10 years
    for those who read on this who aren't using make, it might be worth a note to go into your build directory and delete all files, especially if you are using an IDE like qt creator because you can clean and rebuild to your hearts content but if you dont go in and delete those files, you'll never get rid of that vtable error.
  • maxschlepzig
    maxschlepzig about 9 years
  • Paulo Carvalho
    Paulo Carvalho about 5 years
    This one that worked for me. My class had all the required Qt traits (inherits from QObject, etc.) but the error persisted. My class didn't have a .ui though.