2012-11-16 38 views
14

Tôi có một máy chủ lớp mà tôi đã tạo một tín hiệu được nối (tên QString). Tôi gọi nó là trong một chức năng gọi là tham gia (tên QString), tuy nhiên tôi nhận được lỗitín hiệu qt undefined reference error

Server.o: Trong chức năng Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Máy chủ :: gia nhập (QString)' collect2: ld trở về 1 trạng thái thoát

Đây là những gì tập tin tiêu đề của tôi trông giống như:

#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 

và đây là tập tin cpp của tôi:

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

Trả lời

34

Khi bắt đầu khai báo lớp học, bạn cần có macro Q_OBJECT và đảm bảo kế thừa từ một số hậu duệ QObject.

+1

Và cũng được kế thừa từ QObject, tôi nghĩ vậy? –

+2

tôi đã làm nó, nhưng lần này tôi nhận được một lỗi bổ sung "tài liệu tham khảo không xác định để vtable cho máy chủ" Sự khởi đầu của lớp của tôi bây giờ trông như thế này: lớp Server: QObject công { Q_OBJECT công cộng: . . . } Tôi thậm chí còn làm sạch dự án và đã xây dựng lại tất cả. – Amre

+8

@Amre Run "làm ô uế" và sau đó "qmake" một lần nữa. Điều này sẽ xây dựng lại Makefiles của bạn để các quy tắc moc được cập nhật. Một "làm sạch" là không đủ trong trường hợp này. –

3

Ngoài bất cứ điều gì được đề cập trong this answer, cũng đảm bảo chạy qmake. tức là:

Build > Run qmake 

Điều đó sẽ khắc phục những lỗi này.

Các vấn đề liên quan