2012-11-16 14 views
14

Ho un server di classe per il quale ho creato un segnale unito (nome QString). Io lo chiamo in una funzione chiamata join (nome QString), ma sto ottenendo l'erroreerrore di riferimento qt errore di riferimento non definito

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

questo è ciò che il mio file di intestazione appare come:

#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 

e questo è il mio file cpp:

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

risposta

34

All'inizio della dichiarazione della classe si dovrebbe avere la macro Q_OBJECT e assicurarsi di ereditare da qualche discendente QObject.

+1

E anche ereditare da QObject, penso? –

+2

ho fatto, ma questa volta sto ottenendo un ulteriore errore "undefined reference to vtable per il server" L'inizio della mia classe ha questo aspetto: Class Server: QObject pubblico { Q_OBJECT pubblico: . . . } Ho persino pulito il progetto e ho ricostruito tutto. – Amre

+8

@Amre Run "make distclean", quindi "qmake" di nuovo. Questo ricostruirà i tuoi Makefile in modo che le regole del moc siano aggiornate. In questo caso non è sufficiente un "make clean". –

3

Oltre a quanto menzionato in this answer, assicurarsi anche di eseguire qmake. cioè .:

Build > Run qmake 

Questo dovrebbe correggere questi errori.