QT中编译时出现的undefined reference to 的问题

我在用QT creator想写一个串口通信程序时,跟很多人一样也是
D:\documents\HelloSerialPort\mainwindow.cpp:20: error: undefined reference to SPComm::isOpen() const
D:\documents\HelloSerialPort\debug\mainwindow.o:-1: In function `ZN10MainWindow23on_pushButton_2_clickedEv':
D:\documents\HelloSerialPort\mainwindow.cpp:30: error: undefined reference to `SPComm::isOpen() const'
看网上说是在pro文件中添加类所在的目录,可是我怎么知道它是哪个目录呢?完全不懂啊,求教!下面是我的文件

//mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "SPComm.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    SPComm *m_spcomm;
};

#endif // MAINWINDOW_H

spcomm.h

 #ifndef SPCOMM_H
#define SPCOMM_H

#include <QObject>
#include <QtSerialPort/QtSerialPort>

class SPComm : public QObject
{
    Q_OBJECT
public:
    explicit SPComm(QObject *parent = 0);

    ~SPComm();
    bool isOpen() const;

        void setPortName(const QString &name);
        QString portName() const;

        void setBaudRate(int baudRate);
        int baudRate() const;

        virtual bool open();
        virtual void close();
        virtual bool clear();

        int readData(char *buffer, int count, int timeout = 1000);
        int writeData(char *data, int size);
        int write(char ch);

    protected:
        QString m_portName;
        int m_baudRate;
        QSerialPort *m_serialPort;
signals:

public slots:
};

#endif // SPCOMM_H

增加下面段语句
bool SPComm::isOpen() const
{
if(m_serialPort->isOpen())
return true;
else
return false;
}

// main.cpp

 #include "mainwindow.h"
#include "spcomm.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

//mainwindow.cpp

 #include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_spcomm = new SPComm();
}

MainWindow::~MainWindow()
{
    delete ui;
    delete m_spcomm;
}

void MainWindow::on_pushButton_clicked()
{
    if(m_spcomm->isOpen())
           return;
       m_spcomm->setBaudRate(9600);
       m_spcomm->setPortName("com1");
       if(m_spcomm->open())
           qDebug() << "打开串口成功";
}

void MainWindow::on_pushButton_2_clicked()
{
    if(m_spcomm->isOpen())
            m_spcomm->close();
            qDebug() << "关闭串口成功";
}

//spcomm.cpp

 #include "spcomm.h"

/*SPComm::SPComm(QObject *parent) : QObject(parent)
{

}
*/
static QSerialPort::BaudRate getBaudRate(int baudRate)
{
    switch (baudRate)
    {
    case 1200:
        return QSerialPort::Baud1200;
    case 2400:
        return QSerialPort::Baud2400;
    case 4800:
        return QSerialPort::Baud4800;
    case 9600:
        return QSerialPort::Baud9600;
    case 19200:
        return QSerialPort::Baud19200;
    case 38400:
        return QSerialPort::Baud38400;
    case 57600:
        return QSerialPort::Baud57600;
    case 115200:
        return QSerialPort::Baud115200;
    default:
        return QSerialPort::UnknownBaud;
    }
}

//这个函数用来设置串口的名字
//window 下用"com1"   linux下用"/dev/ttyS0"
void SPComm::setPortName(const QString &name)
{
    m_portName = name;
}

//用来获取串口的名字
QString SPComm::portName() const
{
    return m_portName;
}

//设置波特率 9600  19200  38400
void SPComm::setBaudRate(int baudRate)
{
    m_baudRate = baudRate;
}
//用来打开串口,调用前,先设置串口名字和波特率
bool SPComm::open()
{
    if (m_serialPort->isOpen())
    {
        return true;
    }

    m_serialPort->setPortName(m_portName);
    m_serialPort->setBaudRate(getBaudRate(m_baudRate));
    m_serialPort->setParity(QSerialPort::NoParity);
    m_serialPort->setDataBits(QSerialPort::Data8);
    m_serialPort->setStopBits(QSerialPort::OneStop);
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
    m_serialPort->setReadBufferSize(1024);
    return m_serialPort->open(QSerialPort::ReadWrite);
}
//用来关闭串口
void SPComm::close()
{
    if (m_serialPort->isOpen())
    {
        m_serialPort->close();
    }
}
//重启串口,清楚数据
bool SPComm::clear()
{
    if (m_serialPort->isOpen())
    {
        m_serialPort->clear();
        this->close();
        return this->open();
    }
    return false;
}
//用来接收串口发来的数据
int SPComm::readData(char *buffer, int count, int timeout)
{
    int len = 0;
    forever
    {
        int n = m_serialPort->read(&buffer[len], count - len);
        if (n == -1)
        {
            return -1;
        }
        else if (n == 0 && !m_serialPort->waitForReadyRead(timeout))
        {
            return -2;
        }
        else
        {
            len += n;
            if (count == len)
                break;
        }
    }

    return len;
}
//发送数据到串口  比如发送协议
int SPComm::writeData(char *data, int size)
{
    int len = 0;
    forever
    {
        int n = m_serialPort->write(&data[len], size - len);
        if (n == -1)
        {
            return -1;
        }
        else
        {
            len += n;
            if (size == len)
                break;
        }
    }

    return len;
}
//别忘记了
//构造函数 添加初始化数据
SPComm::SPComm(QObject *parent) : QObject(parent)
{
    m_serialPort = new QSerialPort();
    m_baudRate = 9600;
    m_portName = "";
}
//析构的时候  删除 数据
SPComm::~SPComm()
{
    delete m_serialPort;
}

不知道是要在pro文件中添加什么呢?

在Pro中加上QT += serialport

可能是你只是在.h文件中声明了bool isOpen() const;而没有在.cpp文件中定义它。