2012-11-16 14 views
14

Ich habe einen Klassenserver, für den ich ein Signal erstellt habe (QString-Name). Ich nenne es in einer Funktion verbinden (QString name) genannt, aber ich binqt signal undefined Referenzfehler

Server.o den Fehler bekommen: In Funktion Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Server :: verbunden (QString)‘collect2: ld 1 Exit-Status zurück

Dies ist, was meine Header-Datei wie folgt aussieht:

#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 

und das ist meine CPP-Datei:

#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); 
} 

Antwort

34

Am Anfang Ihrer Klassendeklaration sollten Sie das Makro Q_OBJECT haben und sicher sein, von einigen QObject Nachkommen zu erben.

+1

Und auch von QObject erben, denke ich? –

+2

ich tat es, aber diesmal bin ich einen zusätzlichen Fehler Beginn meiner Klasse sieht nun wie folgt aus „undefiniert Referenz für Server Vtable“ bekommen: Klasse Server: public QObject { Q_OBJECT public: . . . } Ich habe sogar das Projekt sauber gemacht und alles neu aufgebaut. – Amre

+8

@Amre Führen Sie "make distclean" und dann "qmake" erneut aus. Dadurch werden Ihre Makefiles neu erstellt, sodass die Moc-Regeln auf dem neuesten Stand sind. Ein "make clean" ist in diesem Fall nicht genug. –

3

Abgesehen davon, was in this answer erwähnt wird, stellen Sie auch sicher, dass qmake ausgeführt wird. d. h .:

Build > Run qmake 

Das sollte diese Fehler beheben.

Verwandte Themen