【问题标题】:qt signal undefined reference errorqt 信号未定义参考错误
【发布时间】:2012-11-04 18:00:57
【问题描述】:

我有一个类服务器,我为它创建了一个信号连接(QString 名称)。我在一个名为 join(QString name) 的函数中调用它,但是我得到了错误

Server.o: 在函数 Server::join(QString)': Server.cpp:(.text+0x48): undefined reference to Server::joined(QString)' collect2: ld 返回 1 个退出状态

这是我的头文件的样子:

#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

这是我的 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);
}

【问题讨论】:

    标签: c++ qt signals-slots qt-signals


    【解决方案1】:

    在你的类声明的开头你应该有宏 Q_OBJECT 并且一定要继承一些 QObject 的后代。

    【讨论】:

    • 我想也是继承自 QObject 吧?
    • 我做到了,但这次我收到了一个额外的错误“未定义的对服务器 vtable 的引用”我的课程的开头现在看起来像这样: class Server : public QObject { Q_OBJECT public: 。 . .我什至清理了项目并进行了全部重建。
    • @Amre 运行“make distclean”,然后再次运行“qmake”。这将重建您的 Makefile,以便 moc 规则是最新的。在这种情况下,“make clean”是不够的。
    • 对于那些不使用 make 的人来说,进入你的构建目录并删除所有文件可能是值得注意的,特别是如果你使用像 qt creator 这样的 IDE,因为你可以清理并重建您的内心满足感,但如果您不进入并删除这些文件,您将永远无法摆脱该 vtable 错误。
    【解决方案2】:

    除了this answer 中提到的任何内容,还要确保:

    click 'Build' option > Run 'qmake'
    

    这也应该修复未决错误。

    【讨论】:

    • 这个对我有用。我的班级具有所有必需的 Qt 特征(从 QObject 继承等),但错误仍然存​​在。不过,我的班级没有 .ui。
    猜你喜欢
    • 2017-03-25
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多