2012-11-16 19 views
14

Mam serwer klasy, dla którego utworzyłem sygnał połączony (nazwa QString). Ja nazywam go w funkcji o nazwie join (nazwa QString), jednak Dostaję błądSygnał QT Nieokreślony błąd odniesienia

Server.o: W funkcji Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Server :: dołączył (QString)”collect2: ld zwróconym stanem wyjścia 1

to właśnie mój nagłówek pliku wygląda następująco:

#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 

i to jest mój plik 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); 
} 

Odpowiedz

34

Na początku deklaracji klasy powinieneś mieć makro: Q_OBJECT i pamiętaj, aby dziedziczyć po potomku QObject.

+1

A także dziedziczę z QObject, tak myślę? –

+2

Zrobiłem to, ale tym razem jestem coraz dodatkowy błąd „niezdefiniowana odniesienia do vtable na serwerze” początku mojej klasie teraz wygląda tak: klasa serwera: QObject publicznego { Q_OBJECT publiczny: . . . } Nawet wyczyściłem projekt i przebudowałem wszystko. – Amre

+8

@Amre Run "make distclean", a następnie "qmake" ponownie. Spowoduje to przebudowanie plików Makefile, dzięki czemu reguły mocy będą aktualne. "Make clean" nie wystarczy w tym przypadku. –

3

Oprócz tego, co jest wymienione w this answer, należy również uruchomić qmake. tj .:

Build > Run qmake 

To powinno naprawić te błędy.

Powiązane problemy